Выберите только строки с максимальной датой

В таблице 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;

argMax

Заменить <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.

Другие вопросы по тегам