如何使用 SQL 从列中获取 >= 25%、50%、75% 的值

Sco*_*rta 2 sql select where-clause clickhouse

我的表有一个名为Speed(整数) 的列,我需要选择大于该列表中 25%、50%...值的值。

样本数据:

+-------+
| Speed |
+-------+
|     1 |
|     2 |
|     3 |
|     4 |
|     5 |
|     6 |
|     7 |
|     8 |
|     9 |
|    10 |
+-------+
Run Code Online (Sandbox Code Playgroud)

期望的输出:

+--------+
| OUTPUT |
+--------+
|      3 |
|      5 |
|      8 |
+--------+
Run Code Online (Sandbox Code Playgroud)

解释:

  • 列表中 3 >= 25% 的数字
  • 列表中 5 >= 50% 的数字
  • 列表中 8 >= 75% 的数字

我认为我应该对数据进行排序,并执行以下操作:

SELECT speed 
FROM my_table
WHERE speed IN (ROUND(0.25 * <total_row>), ROUND(0.50 * <total_row>),..) 
Run Code Online (Sandbox Code Playgroud)

但我不知道如何获得该<total_row>参考。如果我可以SELECT COUNT(speed) AS total_row,并稍后使用它,那就太好了。

太感谢了。

Den*_*ane 5

create table Speed Engine=Memory \nas select number+1 X from numbers(10);\n\nSELECT quantilesExact(0.25, 0.5, 0.75)(X)\nFROM Speed\n\n\xe2\x94\x8c\xe2\x94\x80quantilesExact(0.25, 0.5, 0.75)(X)\xe2\x94\x80\xe2\x94\x90\n\xe2\x94\x82 [3,6,8]                            \xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\n\n\nSELECT arrayJoin(quantilesExact(0.25, 0.5, 0.75)(X)) AS q\nFROM Speed\n\n\xe2\x94\x8c\xe2\x94\x80q\xe2\x94\x80\xe2\x94\x90\n\xe2\x94\x82 3 \xe2\x94\x82\n\xe2\x94\x82 6 \xe2\x94\x82\n\xe2\x94\x82 8 \xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\n\nSELECT arrayJoin(quantilesExact(0.25, 0.499999999999, 0.75)(X)) AS q\nFROM Speed\n\n\xe2\x94\x8c\xe2\x94\x80q\xe2\x94\x80\xe2\x94\x90\n\xe2\x94\x82 3 \xe2\x94\x82\n\xe2\x94\x82 5 \xe2\x94\x82\n\xe2\x94\x82 8 \xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\n
Run Code Online (Sandbox Code Playgroud)\n\n

在 CH 领域,Join 不适用,因为它通常有数十亿行。

\n\n
create table Speed Engine=MergeTree order by X  as select number X from numbers(1000000000);\n\nSELECT quantilesExact(0.25, 0.5, 0.75)(X)\nFROM Speed\n\n\xe2\x94\x8c\xe2\x94\x80quantilesExact(0.25, 0.5, 0.75)(X)\xe2\x94\x80\xe2\x94\x90\n\xe2\x94\x82 [250000000,500000000,750000000]    \xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\n\n1 rows in set. Elapsed: 7.974 sec. Processed 1.00 billion rows,\n\nSELECT quantiles(0.25, 0.5, 0.75)(X)\nFROM Speed\n\n\xe2\x94\x8c\xe2\x94\x80quantiles(0.25, 0.5, 0.75)(X)\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x90\n\xe2\x94\x82 [244782599,500713390.5,751014086.75] \xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80\xe2\x94\x98\n\n1 rows in set. Elapsed: 1.274 sec. Processed 1.00 billion rows\n
Run Code Online (Sandbox Code Playgroud)\n