2015-06-25 1 views
0

Я бегу SQL Server 2014 и у меня есть следующий T-SQL-запрос:T-SQL запрос, чтобы удалить дубликаты записей в выводе на основе одной конкретной колонке

USE MYDATABASE 

SELECT * 
FROM RESERVATIONLIST 
WHERE [MTH] IN ('JANUARY 2015','FEBRUARY 2015') 

RESERVATIONLIST упоминается в приведенном выше коде является Посмотреть. Запрос дает мне следующий вывод (выдержка):

ID  NAME  DOA   DOD  Nights Spent  MTH 
-------------------------------------------------------------------- 
251 AH  2015-01-12 2015-01-15  3   JANUARY 2015 
258 JV  2015-01-28 2015-02-03  4   JANUARY 2015 
258 JV  2015-01-28 2015-02-03  2   FEBRUARY 2015 

Вышеуказанный результат состоит из около 12 000 записей.

мне нужно изменить мой запрос так, чтобы он устраняет все дубликаты ID и дать мне следующие результаты:

ID NAME  DOA   DOD  Nights Spent  MTH 
-------------------------------------------------------------------- 
251  AH  2015-01-12 2015-01-15  3   JANUARY 2015 
258  JV  2015-01-28 2015-02-03  4   JANUARY 2015 

Я пытался что-то вроде этого, но это не работает:

USE MYDATABASE 

SELECT * 
FROM RESERVATIONLIST 
WHERE [MTH] IN ('JANUARY 2015', 'FEBRUARY 2015')  
GROUP BY [ID] 
HAVING COUNT ([MTH]) > 1 
+0

что логику для выбора строки с '«ЯНВАРЕ 2015'' и не '» Февраль 2015' 'для' ID = 258' – ughai

+0

Нет конкретной логики. Я просто хочу, чтобы запрос выводил один из них. – user3115933

+2

Вы можете так, если хотите. Однако данные в результате не будут иметь реального смысла. Было бы хорошим предложением либо удалять столбцы из результата, либо суммировать их с суммой [ночей, проведенных], мин (м), как первая, max (mth) как последняя'. В первой ситуации ответ будет близок к ответу на deepak pawars, иначе вам лучше использовать оператор GROUP BY для сворачивания итогов. –

ответ

3

После запрос вернет один ряд за один ID:

SELECT * FROM 
(
    SELECT *,ROW_NUMBER() OVER (PARTITION BY ID ORDER BY (SELECT NULL)) rn FROM RESERVATIONLIST 
    WHERE [MTH] IN ('JANUARY 2015','FEBRUARY 2015') 
) T 
WHERE rn = 1 

Примечание: это вернет случайный ряд fr om несколько строк с одинаковым идентификатором. Если вы хотите выбрать определенную строку, то вы должны определить ее в order by. Напр. :

SELECT * FROM 
(
    SELECT *,ROW_NUMBER() OVER (PARTITION BY ID ORDER BY DOA DESC) rn FROM RESERVATIONLIST 
    WHERE [MTH] IN ('JANUARY 2015','FEBRUARY 2015') 
) T 
WHERE rn = 1 

определенно, он вернет строку, имеющую max(DOA).

+0

Блестящий! Только то, что мне нужно! :-) – user3115933

1

Вы пытаетесь сделать оператор GROUP BY, который ИМХО - это правильный путь. Вы должны сформулировать все столбцы, являющиеся константой, и сверните остальные. В зависимости от значения DOD и DOA я вижу два решения:

SELECT ID,NAME,DOA,DOD,SUM([Nights Spent]) as Nights, 
    min(MTH) as firstRes, max(MTH) as lastRes 
FROM RESERVATIONLIST 
GROUP BY ID,NAME,DOA,DOD 

ИЛИ

SELECT ID,NAME,min(DOA) as firstDOA,max(DOD) as lastDOD,SUM([Nights Spent]) as Nights, 
    min(MTH) as firstRes, max(MTH) as lastRes 
FROM RESERVATIONLIST 
GROUP BY ID,NAME 
+0

Спасибо. Я тоже попробую! – user3115933

+0

И это работает? –

+0

Я не получил такое же количество строк в окне результатов, по сравнению с решением Дипака Павара. Мне нужно будет глубже узнать, почему. – user3115933

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

  • Нет связанных вопросов^_^