我有一个包含 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 中也是无效的...
有什么想法吗?
我们可以在这里使用
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;
您可以在这里使用窗口函数,特别是
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 个用户