我有下面的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

我想要的结果如下 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

我能够通过以下查询获得结果

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;

有什么有效的方法可以做到这一点吗?

推荐答案

您可以使用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
EVENTDATE USERID TRAFFIC LOCATION
2023-09-18 user_1 150 A
2023-09-18 user_2 120 B
2023-09-18 user_3 730 C

fiddle

UPD:您还可以参考此函数的文档,其中显示了示例查询以获取多个模式(对于这些模式,您将在原始查询中使用DENSE_RANK而不是ROW_NUMBER).

Sql相关问答推荐

如何查询未命名对象的SON数组

Postgresql -如何计算刷卡和刷卡时间

在数据分区内执行确定

如何连接第二个表并将其内容输入到第一个表的单个字段中?

用于匹配红旗和绿旗的SQL查询

使用SQL创建列出两个时间戳之间小时数的列

使用Kotlin Exposed SQL DSL Select 多个值并排序

在UNION查询中查找MIN

改进的SQL子字符串提取

两个月之间的WHERE CASE WHEN-ORA-00905:缺少关键字

为什么SQL in中的空子查询有时被视为null

group by 并根据同表中其他列的某些条件获取 group by 中的某一列值

当我返回 sql 列时,有没有办法只反转数字? ( hebrew )

如何 for each id创建长度等于id长度的不同日期序列?

SQL:考虑合并分支计算分支的增长百分比

达到特定值时,从0开始累加求和

在 MS Access VBA 中,如何测量显示查询的时间?

更新表 A,然后将新值插入表 B(包含更新内容的历史日志(log))

如何在 RavenDB Studio (RQL) 中插入更新文档

使用 SQL 表中的连接列删除重复记录