Scott, ardışık pazar günleri hakkında harika bir noktaya işaret ediyor. Ben böyle bir konektör tabloyla bu işleme öneririz: daha fazla pazar günleri geçmesi
CREATE TABLE `market_days` (
`market_day` MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT,
`date` DATE NOT NULL DEFAULT '0000-00-00',
PRIMARY KEY USING BTREE (`market_day`),
UNIQUE KEY USING BTREE (`date`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=0
;
olarak, tabloda sadece INSERT
yeni date
değerleri. market_day
buna göre artırılacaktır.
prices
verilerini eklerken, geçmiş değerler için verilen date
'a karşılık gelen değeri LAST_INSERT_ID()
arayınız.
prices
masaya kendisine gelince, sen yapabilirsiniz depolama, SELECT
ve INSERT
işlemleri çok daha verimli bir kullanışlı PRIMARY KEY
ve hiçbir AUTO_INCREMENT
sütun ile. Aşağıdaki şemada, PRIMARY KEY
, kendinize özgü yararlı bilgiler içerir ve yalnızca benzersiz satırları tanımlamak için bir kural değildir. INT
(4 bayt) yerine MEDIUMINT
(3 bayt) kullanıldığında, PRIMARY KEY
numaralı satırda her satır için ek bir bayt ve daha da önemlisi 2 baytlık bir satır kaydedilir; bunların tümü, 16 milyondan fazla olası tarih ve sıralı sembolün (her biri) hala devam etmesini sağlar.
CREATE TABLE `prices` (
`market_day` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0',
`ticker_id` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0',
`price` decimal (7,2) NOT NULL DEFAULT '00000.00',
PRIMARY KEY USING BTREE (`market_day`,`ticker_id`),
KEY `ticker_id` USING BTREE (`ticker_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
;
Bu şemada her satır market_day
ve ticker_id
her bir çifti arasında benzersizdir. İşte ticker_id
market_days
tabloya benzer bir şema ile tickers
tabloda Kısaltma simgeler listesine karşılık gelir: Önerilen bu diğerlerine benzer bir sorgu verir
CREATE TABLE `tickers` (
`ticker_id` MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT,
`ticker_symbol` VARCHAR(5),
`company_name` VARCHAR(50),
/* etc */
PRIMARY KEY USING BTREE (`ticker_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=0
;
, ancak iki önemli farkla: 1) Hiçbir fonksiyonel dönüşüm yok MySQL'in birleştirmede anahtarları kullanma yeteneğini ortadan kaldıran tarih sütunundaki; Aşağıdaki sorguda MySQL, market_day
'a katılmak için PRIMARY KEY
'un bir bölümünü kullanacaktır. 2) MySQL, sadece JOIN
veya WHERE
tümcesinde bir anahtar kullanabilir. Bu sorguda MySQL, PRIMARY KEY
(market_day
ve ticker_id
) 'un tüm genişliğini kullanacaktır, oysa önceki sorguda sadece bir tane kullanabiliyordu (MySQL genellikle iki tanesini daha seçecektir).
SELECT
`market_days`.`date`,
`tickers`.`ticker_symbol`,
`yesterday`.`price` AS `close_yesterday`,
`today`.`price` AS `close_today`,
(`today`.`price` - `yesterday`.`price`)/(`yesterday`.`price`) AS `pct_change`
FROM
`prices` AS `today`
LEFT JOIN
`prices` AS `yesterday`
ON /* uses PRIMARY KEY */
`yesterday`.`market_day` = `today`.`market_day` - 1 /* this will join NULL for `today`.`market_day` = 0 */
AND
`yesterday`.`ticker_id` = `today`.`ticker_id`
INNER JOIN
`market_days` /* uses first 3 bytes of PRIMARY KEY */
ON
`market_days`.`market_day` = `today`.`market_day`
INNER JOIN
`tickers` /* uses KEY (`ticker_id`) */
ON
`tickers`.`ticker_id` = `today`.`ticker_id`
WHERE
`today`.`price` > 0
AND
`yesterday`.`price` > 0
;
bir ince noktası da onlar tuşları yararlanabilirler beri fiili ticker_symbol
ve date
fakat bu işlemler çok hızlı görüntülemek için tickers
ve market_days
karşı katılmak ihtiyacıdır.
@Scott: Yorumunuz için teşekkürler. Zaman aralığını, aralıklarla uğraşmaktan ziyade işleri kolaylaştırmak için sadece tarihe kadar değiştirebilirim. –
@Knix Tarih işlevi oldukça temiz, ne kadar pahalı olduğundan emin değilsiniz, fakat kesinlikle aramanız. Hafta sonları ve tatil günlerinde kapalı olan pazar hakkında hala bir sorun var. previousClose sütunu, kendiliğinden birleşmeyi, kapalı piyasa günlerinin dağınıklığını ortadan kaldırarak veriyi çoğaltmaktan ve günümüzün kapanışını kapattığını bilmek zorundadır. – Scott
Teşekkürler ... Tavsiyenizi alacağım! –