PostgreSQL窗口函数:行数()超过(按col2划分col顺序)
下面的结果集是从一个sql查询中派生出来的,该查询包含几个连接和一个并集。sql查询已按日期和游戏对行进行分组。我需要一个列来描述一个按日期划分的游戏的尝试次数PostgreSQL窗口函数:行数()超过(按col2划分col顺序),sql,postgresql,window-functions,row-number,Sql,Postgresql,Window Functions,Row Number,下面的结果集是从一个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
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曾五次尝试在游戏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重新启动
编辑
如一匹没有名字的马所示,为了满足这一需要,我们需要densite\u rank()
与row\u number()
rank()
或densed\u rank()
不同,重复分配的数字row_number()
对于分区中的每一行必须是不同的值。rank()
和densite\u rank()
之间的区别在于后者不会“跳过”数字
对于您的查询,请尝试:
dense_rank() over (partition by Username, Game order by ct."date") as "Attempts"
顺便说一下,您不需要按同一字段进行分区和排序;如果需要的话,只需订购即可。它不在这里。也许这将有助于查看所需的结果,
(所需尝试列)
组中的行之间的唯一区别是尝试列。也许您可以按用户名、游戏、ID
分组,添加计数(1)
以获取尝试次数,并添加行数()
以获取(所需的尝试列)
?在示例中,只有一种用户名/游戏的组合,每行在语句中都会获得不同的行数(行数()从不生成重复的数字)。应该是density\u rank()(按用户名划分,按ct.“date”划分游戏顺序)
@a\u horse\u和\u no\u name哦,亲爱的,非常正确-我专注于划分;谢谢。我没有足够的创造力去想象“partitionby”子句可以接受多个列,而且我的分区也不正确。谢谢你们两个!这项功能什么时候出现在postgres上的?它相对较新吗?