Фильтрация SQL с помощью COALESCE или оконной функции - PullRequest
4 голосов
/ 08 июля 2011

У меня есть таблица со следующими упрощенными данными:

PK    FK   Type
----------------
1     11    A
2     11    B
3     12    B
4     13    C
5     13    D
6     14    D

И я хочу получить набор результатов:

PK    FK   Type
---------------
1     11    A
3     12    B
4     13    C
6     14    D

Так что, если данное значение FK имеет тип A, не давайте мне никаких строк с B, C или D. Или, если значение имеет тип B, то отфильтровывайте C и D и т. Д. Это похоже на Мне нужно применить оконную функцию или объединиться, но я не уверен, как это сделать.

Ответы [ 2 ]

4 голосов
/ 08 июля 2011

Использование:

SELECT x.* 
  FROM (SELECT s.*, 
               ROW_NUMBER() OVER(PARTITION BY s.fk
                                     ORDER BY s.pk) rnk
          FROM YOUR_TABLE s) x
 WHERE x.rnk = 1

... или использование CTE (без разницы в производительности):

WITH example AS (
  SELECT s.*, 
         ROW_NUMBER() OVER(PARTITION BY s.fk
                               ORDER BY s.pk) rnk
    FROM sample s)
SELECT x.* 
  FROM example x
 WHERE x.rnk = 1

Подтверждение:

WITH sample AS (
  SELECT 1 AS PK, 11 AS FK, 'A' AS [TYPE]
  UNION ALL
  SELECT 2 AS PK, 11 AS FK, 'B' AS [TYPE]
  UNION ALL
  SELECT 3 AS PK, 12 AS FK, 'B' AS [TYPE]
  UNION ALL
  SELECT 4 AS PK, 13 AS FK, 'C' AS [TYPE]
  UNION ALL
  SELECT 5 AS PK, 13 AS FK, 'D' AS [TYPE]
  UNION ALL
  SELECT 6 AS PK, 14 AS FK, 'D' AS [TYPE])
SELECT x.* 
  FROM (SELECT s.*, ROW_NUMBER() OVER(PARTITION BY s.fk
                                          ORDER BY s.pk) rnk
          FROM sample s) x
 WHERE x.rnk = 1

Результат:

pk   fk   type
----------------
1    11   A
3    12   B
4    13   C
6    14   D
1 голос
/ 08 июля 2011

Итак, для каждого значения FK требуется минимальное значение PK, которое соответствует, и соответствующий тип для PK?Как всегда, делайте это поэтапно.

Какие значения PK нам нужны?

SELECT FK, MIN(PK) AS PK
  FROM SimplifiedData
 GROUP BY FK

Как получить соответствующие строки - почему, конечно же, объединиться с основной таблицей:

SELECT S.PK, S.FK, S.Type
  FROM SimplifiedData AS S
  JOIN (SELECT FK, MIN(PK) AS PK
          FROM SimplifiedData
         GROUP BY FK
       ) AS T ON S.PK = T.PK
 ORDER BY S.FK;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...