2015-12-14 3 views
1

Допустим, у меня есть таблица:Четкие колонны, имеющие максимальное значение даты

LpOpenTradeId LPSource SymbolId Volume CreatedUser CreatedDate 
1    2   1   10.00 2   2015-12-11 00:00:00.000 
2    2   4   12.00 2   2015-12-11 00:00:00.000 
3    2   1   10.00 2   2015-12-11 10:53:00.000 
4    2   3   1.00 2   2015-12-11 18:03:14.676 
5    2   5   1.00 2   2015-12-14 09:38:33.691 
6    2   3   2.00 2   2015-12-14 09:39:30.305 
7    2   4   13.00 2   2015-12-14 09:43:13.916 
8    3   1   15.00 2   2015-12-11 10:53:00.000 

Я хочу, чтобы выбрать отчетливое LPSource и столбцы SymbolId с томами, имеющими максимум CreatedDates. Я имею в виду, что целевым набором результатов является:

  LPSource SymbolId Volume    CreatedDate 
      2   1   10.00    2015-12-11 10:53:00.000 
      2   4   13.00    2015-12-14 09:43:13.916 
      2   3   2.00    2015-12-14 09:39:30.305 
      2   5   1.00    2015-12-14 09:38:33.691 
      3   1   15.00    2015-12-11 10:53:00.000 

Как я могу выразить себя, чтобы иметь этот набор результатов в T-SQL?

Благодаря,

ответ

3

Вы можете использовать ROW_NUMBER:

SELECT LPSource, SymbolId, Volume, CreatedDate 
FROM (
SELECT LPSource, SymbolId, Volume, CreatedDate, 
     ROW_NUMBER() OVER (PARTITION BY LPSource, SymbolId 
          ORDER BY CreatedDate DESC) AS rn 
FROM mytable) AS t 
WHERE t.rn = 1 

В случае CreatedDate связей, то есть более чем одной записи, разделяющая то же максимальное CreatedDate значения в пределах одной и те же LPSource, SymbolId раздела, приведенный выше запрос будет случайным образом выбирать одну записи , Вы можете использовать RANK, чтобы выбрать все записи в таком случае.

+0

Я думаю, что вы забыли о скобках ROW_NUMBER(). Спасибо за Ваш ответ. – anilca

+0

@anilca Рад, что я смог помочь. Да, вы правы, исправили это сейчас. –

1

Используйте NOT EXISTS, чтобы вернуть строку, если никакой другой строки с таким же LPSource/SymbolId не имеет (1) более поздней CreatedDate, или (2) то же самое CreatedDate но выше Volume.

select distinct LPSource, SymbolId, Volume, CreatedDate 
from tablename t1 
where not exists (select 1 from tablename t2 
        where t2.LPSource = t1.LPSource 
        and t2.SymbolId = t1.SymbolId 
        and (t2.CreatedDate > t1.CreatedDate 
         or (t2.CreatedDate = t1.CreatedDate and 
          t2.volume > t1.volume)) 
+1

Не гарантирует, что вы получите только один. OP хотел отличные столбцы, поэтому я предполагаю, что даже в случае max-связей должна быть только одна строка, возвращаемая для каждого LPSource, SymbolId. –

+0

Да, возможно, могут быть дубликаты CreatedDate. SELECT DISTINCT удалит дубликаты. – jarlh

+0

Если CreateDate дублируется, а том отличается, отличительный элемент ничего не исправит. Он все равно вернет обе строки. –

1
IF OBJECT_ID('Tabel1','U') IS NOT NULL 
BEGIN 
    DROP TABLE Tabel1 
END 
CREATE TABLE Tabel1 (LpOpenTradeId INT 
,LPSource INT 
,SymbolId INT  
,Volume DECIMAL(10,2) 
,CreatedUser INT 
,CreatedDate DATETIME2 
) 
INSERT INTO Tabel1 VALUES (1,2,1,10,2,'2015-12-11 00:00:00.000'); 
INSERT INTO Tabel1 VALUES (2,2,4,12,2,'2015-12-11 00:00:00.000'); 
INSERT INTO Tabel1 VALUES (3,2,1,10,2,'2015-12-11 10:53:00.000'); 
INSERT INTO Tabel1 VALUES (4,2,3,1,2,'2015-12-11 18:03:14.676'); 
INSERT INTO Tabel1 VALUES (5,2,5,1,2,'2015-12-14 09:38:33.691'); 
INSERT INTO Tabel1 VALUES (6,2,3,2,2,'2015-12-14 09:39:30.305'); 
INSERT INTO Tabel1 VALUES (7,2,4,13,2,'2015-12-14 09:43:13.916'); 
INSERT INTO Tabel1 VALUES (8,3,1,15,2,'2015-12-11 10:53:00.000'); 

    SELECT DISTINCT t1.LPSource 
,t1.SymbolId 
,t1.Volume 
,t1.CreatedDate 
FROM Tabel1 t1 
    JOIN (
     SELECT LPSource 
      ,SymbolId 
      ,MAX(CreatedDate) AS CreatedDate 
     FROM Tabel1 
     GROUP BY LPSource 
      ,SymbolId 
     ) t2 on t2.LPSource = t1.LPSource AND t2.SymbolId = t1.SymbolId AND t2.CreatedDate = t1.CreatedDate 

Соединить часть:

SELECT LPSource 
     ,SymbolId 
     ,MAX(CreatedDate) AS CreatedDate 
    FROM Tabel1 
    GROUP BY LPSource 
     ,SymbolId 

прибудет является последним LPSource и SymbolId. Затем вы присоединяете свою начальную таблицу со всеми столбцами в этой временной таблице (t2), давая вам необходимый результат. T1.LPSource, t1.SymbolId, t1.Volume, t1.CreatedDate

Смежные вопросы