Php mysql查询速度-每3行选择最大值
我有一张保存价格信息的桌子。我需要选择每三行的最大值。例如:Php mysql查询速度-每3行选择最大值,php,mysql,performance,Php,Mysql,Performance,我有一张保存价格信息的桌子。我需要选择每三行的最大值。例如: Table `daily_high` ____ _______ | ID | HIGH | | 1 | 24.65 | | 2 | 24.93 | | 3 | 26.02 | | 4 | 25.33 | | 5 | 25.16 | | 6 | 25.91 | | 7 | 26.05 | | 8 | 28.13 | | 9 | 27.07 | |____|_______| Desired output to n
Table `daily_high`
____ _______
| ID | HIGH |
| 1 | 24.65 |
| 2 | 24.93 |
| 3 | 26.02 |
| 4 | 25.33 |
| 5 | 25.16 |
| 6 | 25.91 |
| 7 | 26.05 |
| 8 | 28.13 |
| 9 | 27.07 |
|____|_______|
Desired output to new table (ID will be auto-increment so don't assume an association exists between this ID 1 and the daily_high ID 1:
____ ___________
| ID | 3MaxHIGH |
|____|___________|
| 1 | 26.02 |
| 2 | 25.91 |
| 3 | 28.13 |
|____|___________|
我想比较IDs1、2和3以确定它们之间的高值。一旦我比较了1-3,我想从4到6,再到7到9,等等,直到我对表中包含的所有值进行了比较,目前大约有400000个值。我已经编写了使用
从日高选择maxHIGH作为dh1加入从日高选择maxHIGH,其中id>=dh1且id谢谢你的帮助 如果你认为它是连续的,你可以这样做
SELECT floor(id/3) as range, max(HIGH) FROM daily_high GROUP BY range;
为什么不使用运算符对聚合进行分组:
SELECT (id-1) DIV 3 + 1 AS ID, MAX(high) AS 3MaxHIGH
FROM daily_high
GROUP BY (id-1) DIV 3
这个查询给出了相同的结果
ID 3MaxHIGH
1 26.02
2 25.91
3 28.13
我无法运行您的查询,我相信这一个更快
UPD:要确保您的范围具有有效的组,请使用以下查询:
select id, high, (id-1) div 3 + 1 from daily_high
结果:
id high (id-1) div 3 + 1
1 24.65 1
2 24.93 1
3 26.02 1
4 25.33 2
5 25.16 2
6 25.91 2
7 26.05 3
8 28.13 3
9 27.07 3
用一个例子更全面地回答。下面的代码将执行我认为您想要的操作
SELECT FLOOR((row - 1) / 3), MAX(Sub1.high)
FROM (SELECT @row := @row + 1 as row, daily_high.*
FROM daily_high, (SELECT @row := 0) r) Sub1
GROUP BY FLOOR((row - 1) / 3)
ORDER BY Sub1.ID
下面的查询在一个测试表上对我有效。也许不是最好的,但其他解决方案在我的测试表上失败了 这确实要求ID是连续的。同时也要确保在高速上加上一个指数
SELECT FLOOR(T1.Id/3)+1 AS Id, ROUND(GREATEST(T1.High, T2.High, T3.High),2) AS High FROM `daily_high` T1, `daily_high` T2, `daily_high` T3
WHERE T2.Id=T1.Id+1
AND T3.Id=T2.Id+1
AND MOD(T1.Id, 3)=1
选择id的楼层除以3和最大高度,按id的楼层除以3进行分组。如果每3条记录都需要它,即使有间隙,那么前3条可能是13和7,那么您可能需要计算一个序列号并使用它。您的查询将给出id列-0,0,1,1,1,2,2。我并不奇怪您不能运行我的查询,我只是边走边键入它。它不是从我的脚本中复制和粘贴的。PHP变量和其他东西会让它变得毫无意义。我以前从未听说过或使用过DIV。我看到您的结果表中有一列在1、2和3的分组中重复1、1、1。这只是为了确保该范围内存在有效组而进行的更新的结果吗?谢谢这看起来要快得多。是的,我显示了这个检查查询,并检查结果以确保1,2,3被分组在一起,这要感谢id中的-1。否则,如果您不从id中减去1,您将分组1,2;然后是3,4,5;等您只需要在程序中使用第一个查询。实际上,DIV是无提示的除法。A分区B与FLOORA/B相同。在国际海事组织,单操作员分区比浮点操作员/+功能楼层快得多。
logic: if(id is divisible by 3, id/3-1, id/3)
select if(mod(id,3) = 0,floor(id/3)-1,floor(id/3)) as group_by_col , max(HIGH)
FROM daily_high GROUP BY group_by_col;