如何在子查询中填写日期?

Posted

技术标签:

【中文标题】如何在子查询中填写日期?【英文标题】:How to fill dates in between in subquery? 【发布时间】:2019-08-21 11:56:13 【问题描述】:

我有一张买东西的桌子:

player_id | date       | registration_date | price
   pl1    | 2019-01-21 | 2019-01-20        |  20
   pl1    | 2019-01-23 | 2019-01-20        |  10
   pl1    | 2019-01-24 | 2019-01-20        |  15

在“日期”上使用 groupArray 和在“价格”上使用 arrayCumSum 并使用 ArrayJoin 计算后,我得到了每天累积总和的表格:

player_id | date       | registration_date | sum_price
   pl1    | 2019-01-21 | 2019-01-20        |  20
   pl1    | 2019-01-23 | 2019-01-20        |  30
   pl1    | 2019-01-24 | 2019-01-20        |  45

但我需要添加从注册到今天的缺失日期(今天是'2019-01-25'):

player_id | date       | registration_date | sum_price
   pl1    | 2019-01-20 | 2019-01-20        |  0
   pl1    | 2019-01-21 | 2019-01-20        |  20
   pl1    | 2019-01-22 | 2019-01-20        |  20
   pl1    | 2019-01-23 | 2019-01-20        |  30
   pl1    | 2019-01-24 | 2019-01-20        |  45
   pl1    | 2019-01-25 | 2019-01-20        |  45

我该怎么做?

【问题讨论】:

您也可以提供您的查询吗? 知道怎么做就不用问了 祝你在这里找到答案:D 【参考方案1】:

试试这个:

SELECT player_id, result.1 as date, registrationDate as registration_date, result.2 as sum_price
FROM
(
    SELECT
        player_id,
        groupArray((date, price)) AS purchases,
        min(registration_date) AS registrationDate,
        arrayMap(x -> registrationDate + x, range(toUInt32(toDate('2019-01-25') - registrationDate + 1))) dates,
        arrayFilter(x -> arrayFirstIndex(p -> p.1 = x, purchases) = 0, dates) AS missed_dates,
        arrayMap(x -> (x, 0), missed_dates) AS dummy_purchases,
        arraySort(x -> x.1, arrayConcat(purchases, dummy_purchases)) all_purchases,
        arrayCumSum(x -> x.2, all_purchases) cum_prices,
        arrayMap(index -> (all_purchases[index].1, cum_prices[index]), arrayEnumerate(all_purchases)) flat_result,
        arrayJoin(flat_result) result
    FROM test.purchases01
    GROUP BY player_id
)

/* result
┌─player_id─┬───────date─┬─registration_date─┬─sum_price─┐
│ pl1       │ 2019-01-20 │        2019-01-20 │         0 │
│ pl1       │ 2019-01-21 │        2019-01-20 │        20 │
│ pl1       │ 2019-01-22 │        2019-01-20 │        20 │
│ pl1       │ 2019-01-23 │        2019-01-20 │        30 │
│ pl1       │ 2019-01-24 │        2019-01-20 │        45 │
│ pl1       │ 2019-01-25 │        2019-01-20 │        45 │
└───────────┴────────────┴───────────────────┴───────────┘

*/


/* Prepare test data */

CREATE TABLE test.purchases01
(
    `player_id` String,
    `date` Date,
    `registration_date` Date,
    `price` int
)
ENGINE = Memory;

INSERT INTO test.purchases01
VALUES  ('pl1', '2019-01-21', '2019-01-20', 20), 
        ('pl1', '2019-01-23', '2019-01-20', 10), 
        ('pl1', '2019-01-24', '2019-01-20', 15);

【讨论】:

非常感谢。我注意到您是有关 Clickhouse 问题的专家。你能推荐我任何具体的文献或在线课程,因为官方指南并没有一直回答我的问题吗? @Jens 我建议查看official documents、meetups/confs、meetup/confs materials。

以上是关于如何在子查询中填写日期?的主要内容,如果未能解决你的问题,请参考以下文章

如何在子查询中使用外部查询中的列从另一个表中获取结果?

在子查询中显示特定日期减去 14 天的所有行

linq在子查询中有最大日期

如何在子查询中实现多列过滤

如何在子查询中使用主查询中的列?

在子查询结果后 52 周检索