2016-11-29 3 views
0

я следующую таблицу:SQL разделов сервера путем дает повторяющиеся записи

Date  | ID | firstname 
---------+----+------------ 
20161128 | 1 | Adam  
20161128 | 2 | Steve  
20161128 | 2 | Steve  
20161128 | 3 | Aaron  
20161129 | 1 | Adam  
20161129 | 2 | Steve  
20161129 | 2 | Steve  
20161129 | 3 | Aaron  

Я хочу, чтобы получить первую строку по идентификатору для одной конкретной даты.

Так что у меня было:

SELECT *  
FROM tableA 
WHERE Date = 20161128 

это, однако, дает все записи. Поэтому я использовал раздел по функции:

SELECT 
    *, 
    row_number() over(partition by ID order by Date desc) 
FROM tableA 
WHERE Date = 20161128 

В этом случае я получаю следующий результат:

Date  | ID | firstname | rownum 
---------+----+-----------+------- 
20161129 | 1 | Adam  | 1 
20161129 | 1 | Adam  | 2 
20161129 | 2 | Steve  | 1 
20161129 | 2 | Steve  | 2 
20161129 | 2 | Steve  | 3 
20161129 | 2 | Steve  | 4 
20161129 | 2 | Steve  | 5 
20161129 | 2 | Steve  | 6 
20161129 | 3 | Aaron  | 1 
20161129 | 3 | Aaron  | 2 

Как вы можете видеть, большинство идентификаторов появляются в 2 раза. (ID 2 даже появляется 6 раз). В других случаях я вижу, что запись появляется 10 раз, даже если у нее будет только одна запись, если бы я использовал первый запрос.

Любая идея, почему это происходит и как это можно устранить? Мое предположение было бы предложением date/where, но я не вижу, как это может сильно повлиять на результат.

+0

Вы можете посмотреть на [ 'TOP'] (https://msdn.microsoft.com/en- нас/библиотека/ms189463.aspx). – HABO

ответ

3

Вам нужен пункт WHERE если вы хотите, чтобы фильтровать записи:

SELECT a.* 
FROM (SELECT a.*, 
      row_number() over(partition by ID order by Date desc) as seqnum 
     FROM tableA a 
     WHERE a.Date = '20161128' 
    ) a 
WHERE seqnum = 1; 

Это вернет одну строку в дату на номер документа.

1

Это отобразит только первый экземпляр.

Select * from 
(SELECT *, 
rownum=row_number() over(partition by PersonID_EXT order by SnapshotDate desc) 
FROM tableA 
WHERE Date = 20161128)x where rownum =1 
+0

обязательно укажите псевдоним столбца row_number. Вы ссылаетесь на него как на розу, но не называете его таковым. – scsimon

+0

вы разместили rownum в неправильном месте ... это должно быть после последних закрывающих круглых скобок '... desc) как rownum' – scsimon

+0

@HoneyBadger не там, где у Криса это было изначально (см. Его редактирование). Это был «row_number() rownumber over (partition by PersonID_EXT order by SnapshotDate desc)». Его последнее изменение сделало его приемлемым. – scsimon

2

Вы можете заменить

SELECT *, 

row_number() over(partition by ID order by Date desc) 

FROM tableA 

WHERE Date = 20161128 

в

SELECT * 

FROM tableA 

WHERE ID = (select min(ID) from tableA) 
Смежные вопросы