我有下表 -
UserId Some_Value1 Datetime
1 0 24-11-2016 13:00
1 0 24-11-2016 13:45
1 1 24-11-2016 15:00
1 1 24-11-2016 17:15
2 0 25-11-2016 11:23
2 1 25-11-2016 13:22
2 0 25-11-2016 14:01
2 1 25-11-2016 18:00
如您所见 - Some_Value1
的值为1
,前一行的日期时间值大于1 Hour
的{{1}}
当userId
字段大于1
时,我试图获取序列号,而不是0
和datetime
。
类似于以下结果 -
1 Hour
我尝试使用UserId Some_Value1 Datetime Some_Value2
1 0 24-11-2016 13:00 1
1 0 24-11-2016 13:45 1
1 1 24-11-2016 15:00 2
1 1 24-11-2016 17:15 3
2 0 25-11-2016 11:23 1
2 1 25-11-2016 13:22 2
2 0 25-11-2016 14:01 2
2 1 25-11-2016 18:00 3
或postgres
来实现这一目标。标记为Redshift
和Oracle
以覆盖更大的受众并获取伪代码作为Mysql
查询对于除内置函数之外的所有数据库大致相同。
以上所有数据仅供参考。这只是样本数据,真实场景会有更多随机数据。因此,代码需要是动态的而不是硬编码的。
答案 0 :(得分:2)
sum (Some_Value1) over
(
partition by UserId
order by Datetime
rows unbounded preceding
) + 1 as Some_Value2
答案 1 :(得分:0)
CREATE TABLE #Table (UserId INT,Some_Value1 INT,_Datetime VARCHAR(20),_Sum INT)
INSERT INTO #Table (UserId ,Some_Value1 ,_Datetime )
SELECT 1,0,'24-11-2016 13:00' UNION ALL
SELECT 1,0,'24-11-2016 13:45' UNION ALL
SELECT 1,1,'24-11-2016 15:00' UNION ALL
SELECT 1,1,'24-11-2016 17:15' UNION ALL
SELECT 2,0,'25-11-2016 11:23' UNION ALL
SELECT 2,1,'25-11-2016 13:22' UNION ALL
SELECT 2,0,'25-11-2016 14:01' UNION ALL
SELECT 2,1,'25-11-2016 18:00'
SELECT UserId ,Some_Value1,_Datetime,sum (Some_Value1) OVER(PARTITION BY UserId ORDER BY _Datetime) + 1 as Some_Value2
FROM #Table