2016-12-13 2 views
0

У меня есть таблица в моей базе данных, что я использую SQL-запрос для извлечения данных. В моем запросе я заменяю некоторый текст и используя целые числа. Запрос возвращает данные ниже:Как я могу выбрать max для каждой строки данных на основе метки времени и уникального идентификатора с использованием SQL?

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 с максимальная ts (временная метка) для каждого идентификатора? Я пробовал MAX (timestamp), но я получаю две строки, возвращенные для одного ID, если total_bookmark отличается (пример: 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 
Смежные вопросы