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;
在 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;