【发布时间】:2021-06-14 23:51:41
【问题描述】:
我想在 MySQL 中实现 SELECT TOP PERCENT。
我在Select TOP X (or bottom) percent for numeric values in MySQL中使用了Victor Sorokin的思路,得到如下查询:
SELECT x.log AS Login,
AVG(x.PROFIT) AS 'Expected Shortfall',
MAX(x.PROFIT) AS '40%VaR'
FROM
(SELECT t.PROFIT,
@counter := @counter +1 AS counter,
t.LOGIN AS log
FROM (SELECT @counter:=0) initvar, trades AS t
WHERE t.LOGIN IN (100,101)
ORDER BY t.PROFIT) AS x
WHERE x.counter <= (40/100 * @counter)
GROUP BY x.log
返回以下结果:
| Login | Expected Shortfall | 40%VaR |
|---|---|---|
| 101 | -85 | -70 |
当我将 WHERE t.LOGIN IN (100,101) 更改为像 WHERE t.LOGIN=100 这样的单个值时,此方法有效。因此它将为每个登录返回我的值,如下所示:
| Login | Expected Shortfall | 40%VaR |
|---|---|---|
| 100 | -4.5 | -4 |
| Login | Expected Shortfall | 40%VaR |
|---|---|---|
| 101 | -95 | -90 |
我不太确定发生了什么,我想知道是否有一种方法可以对多个帐户使用查询,或者有更好的方法来解决这个问题?是否在考虑 LOOP 语句?
我目前使用的是 MySQL 5.7.34 版。如果需要任何澄清,请随时告诉我。任何想法将不胜感激!
编辑:复制问题:
CREATE TABLE trades (
TICKET int(11) PRIMARY KEY,
LOGIN int(11),
PROFIT double)
INSERT INTO trades (TICKET,LOGIN,PROFIT)
VALUES
(1,100,-5),
(2,100,-4),
(3,100,-3),
(4,100,-2),
(5,100,-1),
(6,101,-100),
(7,101,-90),
(8,101,-80),
(9,101,-70),
(10,101,-60),
(11,101,-50),
(12,101,500)
预期的输出就像您分别运行查询 100 和 101 时得到的输出一样:
预期输出
| LOGIN | ES | 40%VAR |
|---|---|---|
| 100 | -4.5 | -4 |
| 101 | -95 | -90 |
【问题讨论】:
-
请edit your question 并提供Minimal, reproducible example .. 例如样本数据和预期输出。
-
不推荐在
SELECT中分配@variables。您已经找到了造成这种情况的原因之一。 -
感谢@FaNo_FN,我已经编辑了问题并提供了一个可重复的示例。请注意,我已将 1/100 * at counter 更改为 40/100 * at counter 以使示例最小化。如果您还有什么需要我澄清的,请告诉我。
-
好的...我提到的解决方案是在 8 年前发布的,这就是原因。谢谢@RickJames
-
您使用的是哪个 MySQL 版本?您可以运行
SELECT @@version进行检查。
标签: mysql