我有以下 SQL 表
eventdate userid traffic location
18.09.2023 user_1 10 A
18.09.2023 user_1 20 A
18.09.2023 user_2 10 B
18.09.2023 user_2 20 B
18.09.2023 user_2 30 B
18.09.2023 user_3 100 A
19.09.2023 user_1 50 B
19.09.2023 user_2 10 B
19.09.2023 user_2 20 B
19.09.2023 user_3 150 C
19.09.2023 user_3 250 C
20.09.2023 user_1 50 A
20.09.2023 user_1 20 A
20.09.2023 user_2 30 B
20.09.2023 user_3 110 C
20.09.2023 user_3 120 C
Run Code Online (Sandbox Code Playgroud)
我想要的结果如下 eventdate - 每周开始,userid - 每周唯一用户 ID,流量 - 所有流量的总和,位置 - 本周出现最频繁的位置
例如
eventdate userid traffic location
18.09.2023 user_1 150 A
18.09.2023 user_2 120 B
18.09.2023 user_3 730 C
Run Code Online (Sandbox Code Playgroud)
我能够通过以下查询获得结果
SELECT t1.eventdate, t1.userid, t1.traffic, t2.location
FROM (SELECT TO_CHAR(TRUNC(TO_DATE('2023-09-18', 'yyyy-mm-dd'), 'IW'),
'yyyy-mm-dd') AS eventdate,
tk.userid,
SUM(tk.traffic) AS traffic
FROM test_kt tk
GROUP BY tk.userid) t1
JOIN (
WITH cte AS
(
SELECT tk2.userid,
tk2.location,
ROW_NUMBER() OVER
(PARTITION BY tk2.userid ORDER BY COUNT(tk2.location) DESC) rn
FROM test_kt tk2
GROUP BY tk2.userid, tk2.location
)
SELECT userid, location
FROM cte
WHERE rn = 1
) t2
ON t1.userid = t2.userid;
Run Code Online (Sandbox Code Playgroud)
有没有有效的方法可以做到这一点?
您可以使用聚合函数实现相同的目的STATS_MODE:
with a(eventdate, userid, traffic, location) as (
select to_date('18.09.2023', 'dd.mm.yyyy'), 'user_1', 10, 'A' from dual union all
select to_date('18.09.2023', 'dd.mm.yyyy'), 'user_1', 20, 'A' from dual union all
select to_date('18.09.2023', 'dd.mm.yyyy'), 'user_2', 10, 'B' from dual union all
select to_date('18.09.2023', 'dd.mm.yyyy'), 'user_2', 20, 'B' from dual union all
select to_date('18.09.2023', 'dd.mm.yyyy'), 'user_2', 30, 'B' from dual union all
select to_date('18.09.2023', 'dd.mm.yyyy'), 'user_3', 100, 'A' from dual union all
select to_date('19.09.2023', 'dd.mm.yyyy'), 'user_1', 50, 'B' from dual union all
select to_date('19.09.2023', 'dd.mm.yyyy'), 'user_2', 10, 'B' from dual union all
select to_date('19.09.2023', 'dd.mm.yyyy'), 'user_2', 20, 'B' from dual union all
select to_date('19.09.2023', 'dd.mm.yyyy'), 'user_3', 150, 'C' from dual union all
select to_date('19.09.2023', 'dd.mm.yyyy'), 'user_3', 250, 'C' from dual union all
select to_date('20.09.2023', 'dd.mm.yyyy'), 'user_1', 50, 'A' from dual union all
select to_date('20.09.2023', 'dd.mm.yyyy'), 'user_1', 20, 'A' from dual union all
select to_date('20.09.2023', 'dd.mm.yyyy'), 'user_2', 30, 'B' from dual union all
select to_date('20.09.2023', 'dd.mm.yyyy'), 'user_3', 110, 'C' from dual union all
select to_date('20.09.2023', 'dd.mm.yyyy'), 'user_3', 120, 'C' from dual
)
select
trunc(eventdate, 'iw') as eventdate,
userid,
sum(traffic) as traffic,
stats_mode(location) as location
from a
group by
trunc(eventdate, 'iw'),
userid
Run Code Online (Sandbox Code Playgroud)
| 活动日期 | 用户身份 | 交通 | 地点 |
|---|---|---|---|
| 2023-09-18 | 用户_1 | 150 | A |
| 2023-09-18 | 用户_2 | 120 | 乙 |
| 2023-09-18 | 用户_3 | 第730章 | C |
UPD:您还可以查阅此函数的文档,其中显示了示例查询以获取多种模式(如果存在)(您将DENSE_RANK在原始查询中使用它来代替ROW_NUMBER)。
| 归档时间: |
|
| 查看次数: |
86 次 |
| 最近记录: |