Выберите только строки с максимальной датой
В таблице 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. Кроме того, насколько я понимаю, нет ON
пункт в базе данных Clickhouse.
UPD: есть ON
пункт в Clickhouse
5 ответов
Решение - 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;
Если вы хотите, чтобы ваш максимальный пункт о том, где утверждение, возможно, это будет работать
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'
Ваш запрос возвращает то, что вам нужно - только одну строку для каждого _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
в кликхаусе это сработает
select _id, argMax(<col you need>, _status_set_at) from pikta.candidates_states group by _id;
Заменить <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
с макс _status_set_at
для этого _id
. Внешний выбор возвращает строки с дополнительными столбцами из таблицы, но только те из них, где_id
а также _status_set_at
являются результатом внутреннего выбора, т.е. с макс. _status_set_at
для каждого _id
.
Я отправил свой ответ, потому что ни один из предыдущих ответов не подходил для первоначального вопроса, насколько я понял. Рассматриваемый запрос должен иметь возможность возвращать другие столбцы, а не только_id
а также _status_set_at
, иначе это бесполезно, вы можете использовать для него базовый выбор, который уже упоминался в вопросе. Ответ Майка нельзя изменить таким образом. Решения Teja не будут работать в Clickhouse.