仅选择具有最大日期的行

时间:2018-08-16 13:51:58

标签: sql database clickhouse

在Clickhouse表中,我有一个_id多行。我想要的是每个_id仅获得一行,其中列_status_set_at具有最大值。 那就是我目前所在的位置:

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

output

由于我无法在max()子句中使用WHERE函数,如何解决此问题? count(_id)显示每个_id的行数,如果查询正确,则应显示1。 另外,就我而言,Clickhouse数据库中没有ON子句。

UPD:Clickhouse中有ON子句

4 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

如果您想使用关于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'

答案 2 :(得分:0)

您的查询返回您需要的内容-每个_id仅一行,其中_status_set_at列具有最大值。 您无需更改原始查询中的任何内容。

count(_id)显示原始表中每个_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

答案 3 :(得分:0)

<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的{​​{1}}对,最大值为_status_set_at。外部选择返回带有表中其他列的行,但仅返回其中的行,其中_id_id是内部选择的结果,即每个_status_set_at的最大值为_status_set_at

我发布了我的回复,因为据我所知,以前的回答都不能解决最初的问题。有问题的请求不仅应该返回_id_id,还应该能够返回其他列,否则,它是无用的,您可以使用基本的select进行选择,这已经在问题中提到了。迈克的答案无法用这种方式修改。 Teja的解决方案无法在Clickhouse中使用。