Select 只有具有最大日期的行

Select only rows with max date

在 clickhouse table 中,我有多行一个 _id。我想要的是每个 _id 只得到一行,其中列 _status_set_at 有其最大值。 这就是我目前的状态:

SELECT _id, max(_status_set_at), count(_id)
FROM pikta.candidates_states
GROUP BY _id

因为我不能在 WHERE 子句中使用 max() 函数,如何解决这个问题? count(_id)显示每个_id有多少行,如果查询正确,应该显示1。 另外,据我所知,Clickhouse 数据库中没有 ON 子句。

UPD:Clickhouse

中有 ON 子句

解决方案 - 1 :

SELECT Z._id,
       Z._status_set_at
  FROM 
(
SELECT _id, 
       _status_set_at, 
       max(_status_set_at) OVER ( PARTITION BY _id ORDER BY _status_set_at DESC ) AS rnk
FROM pikta.candidates_states
) Z
WHERE Z.rnk = 1;

解决方案 - 2 :

SELECT A._id,
       A._status_set_at  
  FROM pikta.candidates_states A
CROSS JOIN
       ( 
         SELECT _id, 
                MAX(_status_set_at) AS max_status_set_dt         
           FROM pikta.candidates_states
         GROUP BY _id
        ) B
WHERE A._id = B._id
  AND A._status_set_at = B.max_status_set_dt; 

如果你想在 where 语句上使用 max 子句,这可能会起作用

SELECT * from (SELECT _id, max(_status_set_at) as [MaxDate], count(_id) as [RepeatCount]
    FROM pikta.candidates_states
    GROUP BY _id) t WHERE t.MaxDate = '@parameter'

您的查询 returns 您需要什么 - 每个 _id 只有一行,其中列 _status_set_at 有其最大值。 您无需更改原始查询中的任何内容。

count(_id) 显示原始 table 中每个 _id 的行数,但不显示在查询结果中。 查询结果每个 _id 只有一行,因为你按 _id 分组。

此查询显示在您的查询结果中每个_id 只有一行

SELECT _id, max_status_set_at, count(_id) FROM (
SELECT _id, max(_status_set_at) max_status_set_at
FROM pikta.candidates_states
GROUP BY _id) t
GROUP BY _id

如果您需要在 max(_status_set_at) 上应用条件,您可以使用 HAVING

<other columns> 替换为您需要 select 的其他列的列表。

SELECT _id, _status_set_at, <other columns>
FROM pikta.candidates_states
WHERE (_id, _status_set_at) in (
    SELECT _id, max(_status_set_at)
    FROM pikta.candidates_states
    GROUP BY _id
)

内部 select returns 对 _id 最大 _status_set_at _id。外部 select returns 行带有来自 table 的附加列,但只有其中 _id_status_set_at 是内部 [=29= 的结果],即每个 _id.

最大 _status_set_at

我发布了我的回复,因为据我了解,none 之前的回答对最初的问题很有帮助。有问题的请求应该可以 return 其他列,而不仅仅是 _id_status_set_at,否则它没用,你可以使用基本的 select ,这已经在题。迈克的答案不能那样修改。 Teja 的解决方案在 Clickhouse 中不起作用。

在 clickhouse 中,这会起作用

select _id, argMax(<col you need>, _status_set_at) from pikta.candidates_states group by _id;

argMax