仅选择具有最大日期的行

zhte4eai  于 2021-07-15  发布在  ClickHouse
关注(0)|答案(4)|浏览(365)

在clickhouse表中,我有多行 _id . 我想要的是每一行只有一行 _id where列 _status_set_at 有它的最大值。这就是我目前的处境:

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


因为我不能用 max() 作用于 WHERE 如何解决这个问题? count(_id) 显示每行有多少行 _id ,如果查询正确,则应显示1。而且,就我而言,没有 ON clickhouse数据库中的子句。
upd:有 ON clickhouse中的子句

gudnpqoy

gudnpqoy1#

您的查询将返回您所需要的内容—对于列status set at的最大值所在的每个\u id,只返回一行。您不需要更改原始查询中的任何内容。
count(\u id)显示原始表中每个\u 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\u set\u at),您可以使用having

7uzetpgm

7uzetpgm2#

解决方案-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;
unhi4e5o

unhi4e5o3#

如果你想在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'
2ul0zpep

2ul0zpep4#

替换 <other columns> 以及您需要选择的其他列的列表。

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
)

内部选择返回成对的 _id 与max _status_set_at 为了这个 _id . external select返回表中带有附加列的行,但仅返回其中的列,其中 _id 以及 _status_set_at 是内部选择的结果,即最大 _status_set_at 对于每个 _id .
我发布了我的回复,因为之前的答案都不适合最初的问题,因为我明白这一点。有问题的请求应该能够返回其他列,而不仅仅是 _id 以及 _status_set_at ,否则就没用了,您可以使用basic select,这已经提到过了。迈克的答案不能那样修改。teja的解决方案在clickhouse中不起作用。

相关问题