如何使用 SQL 选择前 75% 的行

问题描述 投票:0回答:2

我有一个包含 3 列的表格:

user
(字符串),
home
(字符串),
num_events
(整数),像这样:

user1,A,4
user2,B,5
user3,A,2
user4,C,12

一个家可以“容纳”很多用户,但每个用户只属于一个家

我需要过滤掉所有第一个四分位数的用户,每个家庭的 num_events 都较低。为了做到这一点,我的计划是列出每个家庭的所有用户,然后按 num_events 降序排列,只保留前 75%,然后计算每个家庭的用户。

我的尝试与此类似:

WITH t AS (
SELECT home, user, num_events
FROM table 
GROUP BY home_cusec, user, num_events
ORDER BY home_cusec, num_events DESC
)

SELECT home, COUNT(distinct user) FROM t
WHERE num_events > APPROX_PERCENTILE(num_events, 0.25)
GROUP BY home
ORDER BY home

但是我的尝试都没有成功。请注意,我使用的是 AWS Athena,TOP 函数没有注册,所以我无法使用

SELECT TOP 75 PERCENT * FROM t 

我试过

LIMIT (SELECT ROUND( COUNT(*)*0.75 FROM t)

但是这个查询在 AWS Athena 中也是无效的...

有什么想法吗?

sql amazon-web-services count amazon-athena percentile
2个回答
0
投票

我们可以在这里使用

ROW_NUMBER()
COUNT()

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (ORDER BY num_events DESC) rn,
              COUNT(*) OVER () AS cnt
    FROM yourTable
)

SELECT user, home, num_events
FROM cte
WHERE 1.0*rn / cnt <= 0.75;

0
投票

您可以在这里使用窗口函数,特别是

row_number
count

WITH with_row_nums AS (
   SELECT *,
       row_number() over (partition by home order by num_events) row_num,
       count(*) over (partition by home) AS cnt
   FROM table_with_3_col
)

SELECT user, home, num_events
FROM with_rows 
WHERE 1.0 * row_num / cnt > 0.25;

请注意,这至少需要 4 个用户

© www.soinside.com 2019 - 2024. All rights reserved.