Оконная функция PostgreSQL: row_number() over (порядок столбцов по col2)

Следующий набор результатов получен из запроса SQL с несколькими объединениями и объединением. SQL-запрос уже группирует строки по дате и игре. Мне нужен столбец, чтобы описать количество попыток игры, разбитых по столбцу даты.

Username   Game     ID   Date

johndoe1   Game_1   100  7/22/14 1:52 AM
johndoe1   Game_1   100  7/22/14 1:52 AM
johndoe1   Game_1   100  7/22/14 1:52 AM
johndoe1   Game_1   100  7/22/14 1:52 AM
johndoe1   Game_1   121  7/22/14 1:56 AM
johndoe1   Game_1   121  7/22/14 1:56 AM
johndoe1   Game_1   121  7/22/14 1:56 AM
johndoe1   Game_1   121  7/22/14 1:56 AM
johndoe1   Game_1   121  7/22/14 1:56 AM
johndoe1   Game_1   130  7/22/14 1:59 AM
johndoe1   Game_1   130  7/22/14 1:59 AM
johndoe1   Game_1   130  7/22/14 1:59 AM
johndoe1   Game_1   130  7/22/14 1:59 AM
johndoe1   Game_1   130  7/22/14 1:59 AM
johndoe1   Game_1   200  7/22/14 2:54 AM
johndoe1   Game_1   200  7/22/14 2:54 AM
johndoe1   Game_1   200  7/22/14 2:54 AM
johndoe1   Game_1   200  7/22/14 2:54 AM
johndoe1   Game_1   210  7/22/14 3:54 AM
johndoe1   Game_1   210  7/22/14 3:54 AM
johndoe1   Game_1   210  7/22/14 3:54 AM
johndoe1   Game_1   210  7/22/14 3:54 AM

У меня есть следующий SQL-запрос, который перечисляет строки в разделе, но не совсем корректно, так как я хочу, чтобы количество экземпляров этой игры основывалось на дате и игре. В этом случае johndoe1 предпринял попытку Game_1 пять раз разделить отметки времени.

Этот запрос возвращает набор результатов ниже

select *
, row_number() over (partition by ct."date" order by ct."date") as "Attempts"
from csv_temp as ct

Username   Game     ID   Date             Attempts  (Desired Attempts col.)

johndoe1   Game_1   100  7/22/14 1:52 AM  1          1
johndoe1   Game_1   100  7/22/14 1:52 AM  2          1
johndoe1   Game_1   100  7/22/14 1:52 AM  3          1
johndoe1   Game_1   100  7/22/14 1:52 AM  4          1
johndoe1   Game_1   121  7/22/14 1:56 AM  1          2
johndoe1   Game_1   121  7/22/14 1:56 AM  2          2
johndoe1   Game_1   121  7/22/14 1:56 AM  3          2
johndoe1   Game_1   121  7/22/14 1:56 AM  4          2
johndoe1   Game_1   121  7/22/14 1:56 AM  5          2
johndoe1   Game_1   130  7/22/14 1:59 AM  1          3   
johndoe1   Game_1   130  7/22/14 1:59 AM  2          3
johndoe1   Game_1   130  7/22/14 1:59 AM  3          3
johndoe1   Game_1   130  7/22/14 1:59 AM  4          3
johndoe1   Game_1   130  7/22/14 1:59 AM  5          3
johndoe1   Game_1   200  7/22/14 2:54 AM  1          4
johndoe1   Game_1   200  7/22/14 2:54 AM  2          4
johndoe1   Game_1   200  7/22/14 2:54 AM  3          4
johndoe1   Game_1   200  7/22/14 2:54 AM  4          4
johndoe1   Game_1   210  7/22/14 3:54 AM  1          5
johndoe1   Game_1   210  7/22/14 3:54 AM  2          5
johndoe1   Game_1   210  7/22/14 3:54 AM  3          5
johndoe1   Game_1   210  7/22/14 3:54 AM  4          5

Любые указатели будут очень полезны.

1 ответ

Решение

Рассматривать partition by быть похожим на поля, которые вы бы group byзатем, когда значения разделов изменятся, оконная функция перезапускается с 1

РЕДАКТИРОВАТЬ, как указано a_horse_with_no_name, для этого нам нужно dense_rank()В отличие от row_number()rank() или же dense_rank() Повторите числа, которые он присваивает. row_number() должно быть разное значение для каждой строки в разделе. Разница между rank() а также dense_rank() Это последний не "пропустить" номера.

По вашему запросу попробуйте:

dense_rank() over (partition by Username, Game order by ct."date") as "Attempts"

Кстати, вы не разделяете и не упорядочиваете одно и то же поле; достаточно было бы заказать, если бы это было необходимо. Это не здесь.

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