我的表只有一列名为 Speed
(整数),我需要选择大于25%,50%,。。。列表中的值。
样本数据:
+-------+
| Speed |
+-------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10 |
+-------+
期望输出:
+--------+
| OUTPUT |
+--------+
| 3 |
| 5 |
| 8 |
+--------+
解释:
3>=列表中25%的数字
5>=列表中50%的数字
8>=列表中75%的数字
我想我应该对数据进行排序,然后做如下操作:
SELECT speed
FROM my_table
WHERE speed IN (ROUND(0.25 * <total_row>), ROUND(0.50 * <total_row>),..)
但我不知道该怎么做 <total_row>
参考文献。如果我能 SELECT COUNT(speed) AS total_row
,以后再使用,那就太好了。
非常感谢。
4条答案
按热度按时间d5vmydt91#
在ch领域中,join不适用,因为它通常有数十亿行。
nhaq1z212#
这是一个有点长的评论。
基本上,要在sql中回答这个问题,有三种方法:
窗口功能。
计算累计计数的相关子查询。
具有非相等条件的自连接和计算累积计数的聚合。
第一种方法是迄今为止最好的方法。但另外两个可以在不支持窗口函数的数据库中使用。
唉,clickhouse不支持:
窗口功能。
相关子查询。
非等分联接。
它可能具有支持一个或多个此功能的未记录的特性或扩展。但是,基本产品似乎不支持足够的sql,无法将其作为单个查询来执行。
编辑:
似乎有办法,假设
rowNumberInAllBlocks()
遵守中指定的顺序order by
:3htmauhk3#
抱歉,这不是一个有效但有效的解决方案,请尝试以下操作:
为最大值声明变量:
从“我的表”中选择相关值:
zlhcx6iw4#
首先执行自联接,这样每一行都将与所有具有
Speed
小于或等于行Speed
.然后交叉连接到返回表总行数的查询。
最后,按每行所占的百分比进行分组
Speed
更大,四舍五入为25、50和75的整数值,得到最小值Speed
对于每组:这段代码经过测试,适用于mysql、postgresql和sqlserver。
请看演示。
结果: