2016-12-13 43 views
0

我在我的數據庫中有一個表,我正在使用SQL查詢從中檢索數據。在我的查詢中,我正在替換一些文本並使用整數。該查詢返回下面的數據:如何根據時間戳和使用SQL的唯一ID爲每一行數據選擇最大值?

user_id | event_code | total_bookmarks | total_folders | folder_depth | ts 
0   8   34    6    1    128926 
0   8   35    6    1    129001 
4   8   18    2    1    123870 
6   8   30    2    1    130099 
6   8   30    2    1    132000 
6   8   30    2    1    147778 

查詢我使用的是:

SELECT 
user_id, 
event_code, 
CAST(REPLACE(data1, 'total bookmarks', '') AS INTEGER) as total_bookmarks, 
CAST(REPLACE(data2, 'folders', '') AS INTEGER) as total_folders, 
CAST(REPLACE(data3, 'folder depth ', '') AS INTEGER) as folder_depth, 
timestamp AS ts 
FROM events 
WHERE event_code = 8 

我需要什麼,以便添加到我的查詢,只選擇行對每個唯一的user_id與每個ID的最大值(時間戳)?我嘗試了MAX(timestamp),但是如果total_bookmark不同,我會得到兩個相同ID的行(例如:user_id 0,其中一行34,而另一行35)我想讓表看起來像這樣:

user_id | event_code | total_bookmarks | total_folders | folder_depth | ts 
0   8   34    6    1    129001 
4   8   18    2    1    123870 
6   8   30    2    1    147778 
+0

爲什麼會用'mysql'和'postgresql'標記? – shmosel

+0

因爲我正在使用postgresql,但我認爲這可以用相同的方式或以與mysql類似的方式完成 – cjh193

+1

請不要這樣做。你浪費自己的時間和其他人的時間。 – shmosel

回答

0
Declare @table table (user_id int, event_code int, total_bookmarks int, total_folders int, folder_depth int, ts decimal(18,0)) 
Insert into @table (user_id , event_code , total_bookmarks , total_folders , folder_depth , ts) 
Values (0,8,34,6,1,128926), 
     (0,8,34,6,1,129001), 
     (4, 8, 18 , 2, 1, 123870), 
     (6, 8, 30, 2, 1, 130099), 
     (6, 8, 30, 2, 1, 132000), 
     (6, 8, 30, 2, 1, 147778) 

Select * from @table 

Select  user_id,event_code,total_bookmarks,total_folders,folder_depth,ts 
From  (
      Select  RANK() over (Partition by user_id 
            Order by ts desc 
            ) as Rank, 
         user_id,event_code,total_bookmarks,total_folders,folder_depth,ts 

      From  @table 
      ) D1 
Where  D1.Rank = 1 
相關問題