#sql #subquery #greatest-n-per-group #snowflake-cloud-data-platform #window-functions
#sql #подзапрос #наибольшее число записей на группу #snowflake-cloud-data-platform #окно-функции
Вопрос:
Возникли проблемы с тем, что, как я думал, было бы довольно просто. Пытаясь получить количество элементов, у которых нет заголовка, наша система отслеживает записи по ‘last_updated_date’.
id work_item title last_updated_date
1 task1 ProjectA 2020-03-25 20:20:01.111
2 task2 ProjectA 2020-03-25 20:20:01.111
3 task3 2020-03-25 20:20:01.111
4 task4 ProjectB 2020-03-25 20:20:01.111
5 task5 ProjectC 2020-03-25 20:20:01.111
Как вы можете видеть, мне нужно посмотреть, какие рабочие элементы не имеют проекта. Если бы я посмотрел историю для ‘task1’, я бы увидел что-то вроде следующего:
select work_item, last_updated_date, project
from table
where work_item = 'task1'
Это приведет к:
work_item last_updated_date title
task1 2020-03-25 20:20:01.111 ProjectA
task1 2020-03-17 20:20:01.111 NULL
task1 2020-03-12 20:20:01.111 NULL
Исходя из этого, я вижу, что task1 получил название, присвоенное 2020-03-25. Что мне нужно знать, так это то, скольким рабочим элементам во всем наборе данных не присвоен элемент. Поэтому я хочу проверить все записи, используя дату последнего обновления, и проверить последнюю last_updated_date, чтобы узнать, равен ли заголовок null. Я попробовал следующее, но, по-моему, я неправильно использую MAX и / или group by? Я возвращаю записи с присвоенными заголовками, что заставляет меня думать, что он проверяет МАКСИМАЛЬНОЕ значение всего столбца last_updated_date, а не каждой записи внутри.
select id, title, MAX(last_updated_date) as "latest_timestamp"
FROM table
WHERE title is null
group by id, title
Я хотел бы видеть, что только task3 отображается как нуждающийся в присвоении заголовка.
Комментарии:
1. Я вижу, что вы получили приемлемый ответ, но вы также можете проверить функцию окна last_value() в Snowflake. Это позволило бы полностью избежать подзапроса: docs.snowflake.com/en/sql-reference/functions/last_value.html
Ответ №1:
Один из вариантов использует подзапрос для фильтрации по последней записи для каждого элемента. Затем вы можете подсчитать, сколько из них не имеют заголовка:
select count(*)
from mytable t
where
last_updated_date = (
select max(t1.last_updated_date)
from mytable t1
where t1.work_item = t.work_item
)
and title is null
Вы также можете использовать оконные функции:
select count(*)
from (
select t.*,
row_number() over(partition by work_item order by last_updated_date desc) rn
from mytable t
) t
where rn = 1 and title is null
Комментарии:
1. Вау, первый сработал. Я попробовал вложенный select, но я поставил свои условия для предложения where до, а не после. Похоже, теперь я получаю правильные результаты.