如何在ClickHouse中查找价格下跌的产品?

时间:2019-01-17 16:26:00

标签: clickhouse

在ClickHouse中,我有product_prices表,其中包含产品价格的历史记录。该表包含以下属性:

CREATE TABLE product_prices
(
    ProductId UInt64,
    TrackedAt Date,
    Price Nullable(Decimal(6, 2))
)
ENGINE MergeTree() ORDER BY (ProductId, TrackedAt)

我需要从一组product_ids的预定义集中找到满足以下条件的那些:
此product_id的最新价格低于倒数第二个。


示例:

| ProductId  | Price       | TrackedAt    |  
|:-----------|------------:|:------------:|  
| 1          |       20    |  2019-01-16  |  
| 1          |       19    |  2019-01-17  |  
| 2          |        5    |  2019-01-16  |  
| 2          |        7    |  2019-01-17  |  

我需要获得

| ProductId  |
|:-----------|
| 1          |

我只能找到一种产品的区别:

select (argMax(Price, TrackedAt) - argMin(Price, TrackedAt)) from (select ProductId, Price, TrackedAt from product_prices where ProductId = 1000 order by TrackedAt DESC limit 2)

您知道我可以做到这一点的方式吗?

1 个答案:

答案 0 :(得分:3)

基本思想是使用数组捕获每个产品的本地状态。通过使用返回带有TrackedAt的升序记录的子查询,可以获得每种产品的升序数组。

WITH groupArray(Price) AS ps
SELECT ProductId
FROM
(
    SELECT *
    FROM product_prices
    ORDER BY TrackedAt ASC
)
GROUP BY ProductId
HAVING (length(ps) > 1) AND (ps[-1] < ps[-2])