2016-07-05 2 views
0

мне нужно вернуть только первую строку каждого повторяющегося числа, кроме нулей в запросе:T-SQL SELECT TOP 1 DISTINCT для повторения

DECLARE @Test TABLE 

(
ID NVARCHAR(10) 
,Number INT 

) 
INSERT INTO @Test VALUES ('TG32',6) 
INSERT INTO @Test VALUES ('TG47',6) 
INSERT INTO @Test VALUES ('AG9',6) 
INSERT INTO @Test VALUES ('BF27',2) 
INSERT INTO @Test VALUES ('QD65',2) 
INSERT INTO @Test VALUES ('F98',0) 
INSERT INTO @Test VALUES ('GC5',0) 
INSERT INTO @Test VALUES ('HT76',0) 
INSERT INTO @Test VALUES ('KL81',0) 
INSERT INTO @Test VALUES ('WR52',0) 

SELECT * FROM @Test 

Я пытаюсь получить:

ID Номер

TG32 6 
BF27 2 
F98  0 
GC5  0 
HT76 0 
KL81 0 
WR52 0 
+0

Я попытался DISTINCT, NULLIF, CASE заявление без толка :-( – SSMSJ

+1

вы говорите " возвращайте ТОЛЬКО первую строку каждого повторяющегося числа «...», чтобы добиться того, что ее нужно отслеживать с помощью дополнительного столбца, который имеет временную метку или последовательно увеличивающийся идентификатор с использованием столбца идентификации или последовательности или указателя и т. д., иначе SQL Server не гарантирует возврата строк в том порядке, в котором они были вставлены. – objectNotFound

+0

Хорошо, во-первых, ваш пример не имеет столбцов с повторяющимися числами. Если вы хотите, чтобы кто-то получил желаемый результат, дайте им возможность произвести правильные результаты. –

ответ

0

Вы можете сделать это с помощью ROW_NUMBER и суб запроса.

SELECT ID, Number 
FROM (
    SELECT *, 
      ROW_NUMBER() OVER (PARTITION BY Number ORDER BY (SELECT 1))as RN 
    FROM @test) as d 
WHERE (CASE WHEN d.Number = 0 THEN 1 ELSE d.RN END) = 1 

Также вы можете использовать другую ИНЕКЕ

WHERE d.Number = 0 OR d.RN = 1 

С КТРОМ:

;WITH cte as (
SELECT *, 
     ROW_NUMBER() OVER (PARTITION BY Number ORDER BY (SELECT 1))as RN 
FROM @test) 

SELECT ID, Number 
FROM cte 
WHERE Number = 0 or RN = 1 
+1

SELECT, идентификационный номер, FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY Number ORDER BY (SELECT 1)) в качестве RN FROM @test) в качестве г где (случай, когда d.Number = 0 THEN 1 ELSE d.RN END) = 1 – SSMSJ

+1

Где дело сложнее. d.Number = 0 или d.RN = 1 – Paparazzi

+0

@Paparazzi может быть немного сложнее. Добавьте это к моему ответу. – gofr1

-1

ли что-то вроде этого:

SELECT DISTINCT * FROM @Test 

Надеюсь, что помогает.

+0

Я думал больше о том, как разбить его на #Table с предложением, а затем применить другое предложение к таблице #Temp? – SSMSJ

2

Предположим, что ваш идентификатор столбца заказана можно сгруппировать по номеру и получить минимум ID но исключает строки с номером = 0, а затем накидной строки, где число равно 0. Это query реализует, что:

SELECT MIN(id) as ID -- get the minimum value in a group 
    , number  -- the nmber for the group 
FROM @test 
WHERE number <> 0 -- but leave out rows where number is zero 
GROUP BY number  -- get those together 
UNION    -- add all the other rows 
SELECT id 
    , number 
FROM @test 
WHERE number = 0  -- that have a number that is zero 

Какие результаты в:

BF27 2 
AG9 6 
F98 0 
GC5 0 
HT76 0 
KL81 0 
WR52 0 
+0

с неправильным номером – Paparazzi

+0

@Paparazzi, который теперь исправлен ... – rene

+0

Это не показывает первую строку. На самом деле нет первой строки. По крайней мере, это будет иметь повторяющиеся результаты. Нет гарантии, что принятый ответ будет иметь повторяющиеся результаты. – Paparazzi