clickhouse - 日期之间的前 10 名产品

标签 clickhouse

我正在尝试找出创建单个查询的更好方法,该查询将生成每个日期排名前 10 的产品的结果。我有一行包含两列 - PID (int)EventDate (date),每次点击一行。

您能否建议我如何获取某个日期范围内点击次数最多的 10 个产品的结果?我一直在理解如何构建子查询。我只能得到按日期分组的部分,但随后我的注意力就陷入了 count() 和聚合问题。

这是我对单个日期的查询,但我想查询一系列日期。当然,我可以通过生成事件日期来进行子查询,但想弄清楚如何更优雅地做到这一点。

SELECT TOP 10 COUNT() as count, PID
FROM view_product
WHERE EventDate = toDate('2020-05-11')
GROUP BY PID
ORDER BY count DESC

预期的输出是这样的:

PID Count Date
1   123   2020-02-04
21  101   2020-02-04
1332 99   2020-02-04
11   51   2020-02-04
634  49   2020-02-04
1332 43   2020-02-04
1   24   2020-02-04
21  23   2020-02-04
1332 6   2020-02-04
11   3   2020-02-04

1   266   2020-02-02
21  241   2020-02-02
1332 232   2020-02-02
11   179   2020-02-02
634  163   2020-02-02
1332 159   2020-02-02
1   144   2020-02-02
21  100   2020-02-02
1332 99   2020-02-02
11   74   2020-02-02

最佳答案

需要使用LIMIT BY - 每天占用前 10 行的子句:

SELECT
  PID, 
  EventDate,
  count() AS Count
FROM view_product
WHERE EventDate >= '2020-05-01' AND EventDate < '2020-06-01'
GROUP BY EventDate, PID
ORDER BY EventDate, Count DESC
LIMIT 10 BY EventDate;

测试示例:

SELECT
  PID, 
  EventDate,
  count() AS Count
FROM (
  /* emulate test set */
  SELECT test_data.1 AS PID, toDate(test_data.2) AS EventDate
  FROM (        
    SELECT arrayJoin([
        (1,    '2020-02-04'),
        (21,   '2020-02-04'),
        (1332, '2020-02-04'),
        (11,   '2020-02-04'),
        (634,  '2020-02-04'),
        (1,    '2020-02-04'),
        (1,    '2020-02-04'),
        (21,   '2020-02-04'),
        (1,    '2020-02-04'),
        (1,    '2020-02-02'),
        (21,   '2020-02-02'),
        (11,   '2020-02-02'),
        (1332, '2020-02-02'),
        (1332, '2020-02-02'),
        (1332, '2020-02-02'),
        (11,   '2020-02-02')]) test_data))
GROUP BY EventDate, PID
ORDER BY EventDate, Count DESC
LIMIT 2 BY EventDate;
/* result
┌──PID─┬──EventDate─┬─Count─┐
│ 1332 │ 2020-02-02 │     3 │
│   11 │ 2020-02-02 │     2 │
│    1 │ 2020-02-04 │     4 │
│   21 │ 2020-02-04 │     2 │
└──────┴────────────┴───────┘
*/

要仅获取没有计数值的前 n 个项目,请使用 topK -聚合函数:

SELECT 
  EventDate,
  topK(10)(PID)
FROM (
  /* emulate test set */
  SELECT test_data.1 AS PID, toDate(test_data.2) AS EventDate
  FROM (        
    SELECT arrayJoin([
        (1,    '2020-02-04'),
        (21,   '2020-02-04'),
        (1332, '2020-02-04'),
        (11,   '2020-02-04'),
        (634,  '2020-02-04'),
        (1,    '2020-02-04'),
        (1,    '2020-02-04'),
        (21,   '2020-02-04'),
        (1,    '2020-02-04'),
        (1,    '2020-02-02'),
        (21,   '2020-02-02'),
        (11,   '2020-02-02'),
        (1332, '2020-02-02'),
        (1332, '2020-02-02'),
        (1332, '2020-02-02'),
        (11,   '2020-02-02')]) test_data))
GROUP BY EventDate;
/* result
┌──EventDate─┬─topK(10)(PID)──────┐
│ 2020-02-02 │ [1332,11,1,21]     │
│ 2020-02-04 │ [1,21,1332,11,634] │
└────────────┴────────────────────┘
*/

关于clickhouse - 日期之间的前 10 名产品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61850167/

相关文章:

ttl - ClickHouse 物化列上的 TTL

Clickhouse:DB::Exception:超出内存限制(用于查询)

clickhouse - 定义每个读取查询的优先级 : making some queries run in background

moving-average - Clickhouse移动平均线

clickhouse - 在 Ubuntu 16.04 上安装 clickhouse 后连接被拒绝

sql - Clickhouse 选择所有表上没有 max() 的最后一条记录

apache-kafka - 使用kafka为clickhouse生产数据

docker - 在 kubernetes 中运行的命令挂起

clickhouse - 无法启动 ClickHouse。退出代码 203

database - 如何在clickhouse数据库中的同一个选择查询中查询多个数据库?