这是组内聚合的典型问题,可以通过左自排除连接解决。
你不需要任何存储过程来获得你想要的结果,只需一个简单的INSERT INTO ... SELECT ...
查询就可以了。
这是一个包含提供数据的示例脚本:
创建表 shuffled_symbols (
dat INT NOT NULL
,symbol VARCHAR(4) NOT NULL
,pct_return DECIMAL(4,2) NOT NULL
,PRIMARY KEY (dat ,符号)
);
创建表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);
插入 shuffled_symbols (dat,symbol,pct_return) 值 (1100101,'HPQ',-0.5);
INSERT INTO shuffled_symbols (dat,symbol,pct_return) VALUES (1100102,'IBM',-0.02);
插入 shuffled_symbols (dat,symbol,pct_return) 值 (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
;
请注意,如果您在给定日期没有重复的符号,则此查询只会返回有效排名。这就是为什么我shuffled_symbols
用PRIMARY KEY (dat ,symbol)
.
在ranked_symbols 表中,您会得到以下结果:
选择 * FROM 排名符号;
+---------+--------+------------+----------+------ -----+
| 数据 | 符号 | pct_return | rank_asc | rank_desc |
+---------+--------+------------+----------+------ -----+
| 1100101 | 苹果 | 2.10 | 3 | 1 |
| 1100101 | 高品质 | -0.50 | 1 | 3 |
| 1100101 | IBM | 1.20 | 2 | 2 |
| 1100102 | 苹果 | -0.60 | 1 | 3 |
| 1100102 | 高品质 | 1.90 | 3 | 1 |
| 1100102 | IBM | -0.02 | 2 | 2 |
+---------+--------+------------+----------+------ -----+
6 行一组(0.00 秒)