這是組內集合的典型問題,這是左自排斥加入解決。
你不需要任何存儲過程來獲得你想要的結果,只是一個簡單的INSERT INTO ... SELECT ...
查詢就可以做到。
這裏是與所提供的數據的示例腳本:
CREATE TABLE shuffled_symbols (
dat INT NOT NULL
,symbol VARCHAR(4) NOT NULL
,pct_return DECIMAL(4,2) NOT NULL
,PRIMARY KEY (dat ,symbol)
);
CREATE TABLE ranked_symbols (
dat INT NOT NULL
,symbol VARCHAR(4) NOT NULL
,pct_return DECIMAL(4,2) NOT NULL
,rank_asc INT UNSIGNED NOT NULL
,rank_desc INT UNSIGNED NOT NULL
);
INSERT INTO shuffled_symbols (dat,symbol,pct_return) VALUES (1100101,'IBM',1.2);
INSERT INTO shuffled_symbols (dat,symbol,pct_return) VALUES (1100101,'AAPL',2.1);
INSERT INTO shuffled_symbols (dat,symbol,pct_return) VALUES (1100101,'HPQ',-0.5);
INSERT INTO shuffled_symbols (dat,symbol,pct_return) VALUES (1100102,'IBM',-0.02);
INSERT INTO shuffled_symbols (dat,symbol,pct_return) VALUES (1100102,'AAPL',-0.6);
INSERT INTO shuffled_symbols (dat,symbol,pct_return) VALUES (1100102,'HPQ',1.9);
這裏是計算行列查詢(對不起,壞的格式,我無法把它裏面<pre>
標籤正確顯示):
INSERT INTO ranked_symbols ( dat, symbol, pct_return, rank_asc, rank_desc ) SELECT ars.dat, ars.symbol, ars.pct_return, ars.rank_asc, COUNT(ss3.dat)+1 rank_desc FROM ( SELECT ss1.dat, ss1.symbol, ss1.pct_return, COUNT(ss2.dat)+1 rank_asc FROM shuffled_symbols ss1 LEFT JOIN shuffled_symbols ss2 ON ss2.dat = ss1.dat AND ss2.pct_return < ss1.pct_return GROUP BY ss1.dat, ss1.symbol ) ars LEFT JOIN shuffled_symbols ss3 ON ss3.dat = ars.dat AND ss3.pct_return > ars.pct_return GROUP BY ars.dat, ars.symbol ;
請注意,此查詢將只返回有效的行列,如果你沒有給定日期符號的重複。這就是爲什麼我使用PRIMARY KEY (dat ,symbol)
創建了shuffled_symbols
表格。
在ranked_symbols表,你得到如下結果:
SELECT * FROM ranked_symbols;
+---------+--------+------------+----------+-----------+
| dat | symbol | pct_return | rank_asc | rank_desc |
+---------+--------+------------+----------+-----------+
| 1100101 | AAPL | 2.10 | 3 | 1 |
| 1100101 | HPQ | -0.50 | 1 | 3 |
| 1100101 | IBM | 1.20 | 2 | 2 |
| 1100102 | AAPL | -0.60 | 1 | 3 |
| 1100102 | HPQ | 1.90 | 3 | 1 |
| 1100102 | IBM | -0.02 | 2 | 2 |
+---------+--------+------------+----------+-----------+
6 rows in set (0.00 sec)
請提供該表的CREATE TABLE語句。 – 2010-11-05 20:42:25
CREATE TABLE'T_0_ranked2'( 'date' int(11)default NULL, 'sym' varchar(8)default NULL, 'pct_return' decimal(8,2)default NULL, 'event_id' int(10) unsigned NOT NULL, 使用BTREE的主鍵('event_id') )ENGINE = MyISAM DEFAULT CHARSET = latin1; (1100101,'IBM','1.20',1),(1100101,'AAPL','2.10',2),(1100101,'HPQ',' - 0.50',3)插入'T_0_ranked2'VALUES ,(1100102, 'IBM', ' - 0.02',4),(1100102, 'AAPL', ' - 0.60',5),(1100102, 'HPQ', '1.90',6); – 2010-11-05 21:44:46