Оконная функция 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"
Кстати, вы не разделяете и не упорядочиваете одно и то же поле; достаточно было бы заказать, если бы это было необходимо. Это не здесь.