在Clickhouse表中,我有一个_id
多行。我想要的是每个_id
仅获得一行,其中列_status_set_at
具有最大值。
那就是我目前所在的位置:
SELECT _id, max(_status_set_at), count(_id)
FROM pikta.candidates_states
GROUP BY _id
由于我无法在max()
子句中使用WHERE
函数,如何解决此问题?
count(_id)
显示每个_id
的行数,如果查询正确,则应显示1。
另外,就我而言,Clickhouse数据库中没有ON
子句。
UPD:Clickhouse中有ON
子句
答案 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中使用。