2015-11-05 5 views
1

У меня есть таблица базы данных, как показано ниже.выберите одну строку из нескольких строк по id

id | value |flag 
    2 null  1 
    2  z  2 
    3  x  1 
    3  y  2 
    3  z  3 
    4  null 2 

мне нужно привести как следующий

id | value |flag 
    2  z  2 
    3  x  1 
    4  null  2 

Если значение равно нулю, то значение от другого согласованного идентификатора следует (2-г-2). Если все строки идентификатора не равны нулю, тогда значение должно быть присвоено приоритетом, который равен 1 здесь (3-x-1). Если идентификатор имеет только нулевое значение, возьмите любую строку с нулевым значением, и флаг здесь не имеет значения.

+0

Так по приоритету вы имеете в виду столбец флаг? Что делать, если у вас несколько идентификаторов, которые соответствуют нулевому значению? Что вы пробовали, что не сработало и т. Д. И т. Д. – Levesque

+0

Да, приоритетом здесь является флаг. Мне нужно 1 строка для 1 id. Если несколько идентификаторов имеют только нулевое значение, они перейдут к отдельным строкам с нулевым значением. Я обновил вопрос. – bill

ответ

5

Этот запрос принимает значение первого не нулевого значения (минимальное значение флага) или нулевую строку в противном случае.

Вы данные:

DECLARE @table TABLE 
    (id INT , val CHAR(1) , flag INT); 
INSERT INTO @table 
     (id, val, flag) 
VALUES (2, NULL, 1) 
,  (2, 'z', 2) 
,  (3, 'x', 1) 
,  (3, 'y', 2) 
,  (3, 'z', 3) 
,  (4, NULL, 2); -- NULL only value 

Запрос:

SELECT id , 
     val , 
     flag 
FROM (SELECT * , 
      n = ROW_NUMBER() OVER (PARTITION BY id ORDER BY CASE 
                WHEN val IS NULL 
                THEN 0 
                ELSE 1 
                END DESC, flag) 
      FROM  @table AS t 
     ) AS o 
WHERE n = 1; 

ROW_NUMBER() перегородки по id и для каждого id, это заказы на 0 или 1 (нуль/не равно нулю) и flag , case используется для заказа по not null значениям сначала (= 1), а затем по null значениям (= 0).

Выход:

id val  flag 
2 z  2 
3 x  1 
4 NULL 1 
+0

Просто хотел опубликовать то же самое решение. –

+0

Это часто случается :) –

+0

Надеюсь, вы не против, я удалил выделение синтаксиса Quote, которое вы использовали (которое должно использоваться только для цитируемого текста) и заменило его жирным заголовком и сделало некоторые форматирования SQL, когда я был на нем. – Tanner