2016-11-21 37 views
1

我有如下表 -入門合計值

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爲同一userId

我試圖得到一個序列號,而不是10datetime場比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 

我試圖做到這一點使用postgresRedshift。標記OracleMysql接觸到更多的觀衆,並得到僞代碼SQL查詢將主要是,除了內置的功能,所有數據庫相同。

以上所有數據的僅僅是爲了代表性的目的。這只是樣本數據,真實場景會有更多的隨機數據。因此,代碼需要是動態的,而不是硬編碼的。

+0

你的假設是錯誤的。刪除了錯誤的數據庫標籤。 –

回答

2
sum (Some_Value1) over 
(
    partition by UserId 
    order by  Datetime 
    rows   unbounded preceding 
) + 1         as Some_Value2 
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 
+0

儘管基本想法是正確的,但您不應該用任何標記數據庫(Postgres或Redshift)不適用的語法來回答。 –