在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)
您知道我可以做到这一点的方式吗?
答案 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])