获取聚合值

时间:2016-11-21 03:26:00

标签: sql postgresql amazon-redshift

我有下表 -

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时,我试图获取序列号,而不是0datetime

类似于以下结果 -

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来实现这一目标。标记为RedshiftOracle以覆盖更大的受众并获取伪代码作为Mysql查询对于除内置函数之外的所有数据库大致相同。

以上所有数据仅供参考。这只是样本数据,真实场景会有更多随机数据。因此,代码需要是动态的而不是硬编码的。

2 个答案:

答案 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