Запрос на исключение строки на основе фильтра другой строки - PullRequest
1 голос
/ 10 июня 2011

Я использую Oracle 10g.

Вопрос: Как я могу написать запрос для возврата только идентификатора, только если ВСЕ коды для этого идентификатора заканчиваются на 6?

Я не хочу ID = 1, потому что не все его коды заканчиваются на 6.

TABLE_A

ID  Code
===============
1   100  
1   106
2   206
3   316
3   326
4   444

Desired Result:
ID
==
2
3

Ответы [ 2 ]

2 голосов
/ 11 июня 2011

Вы просто хотите, чтобы каждый идентификатор, где количество строк для этого идентификатора, равно количеству строк, где третья цифра равна шести.

SELECT ID
FROM TABLE_A
GROUP BY ID
HAVING COUNT(*) = COUNT(CASE WHEN SUBSTR(code,3,1) = '6' THEN 1 END)
1 голос
/ 10 июня 2011

Попробуйте это:

SELECT DISTINCT b.id
  FROM (
        SELECT id, 
                COUNT(1) cnt
          FROM table_a  
         GROUP BY id 
        ) a,
        (
        SELECT id, 
                COUNT(1) cnt
          FROM table_a  
         WHERE CODE LIKE '%6'
         GROUP BY id
        )b
WHERE a.id = b.id
  AND a.cnt = b.cnt

Альтернатива с использованием АНАЛИТИЧЕСКИХ функций:

SELECT DISTINCT id   
  FROM 
    (
    SELECT  id, 
            COUNT(1)  OVER(PARTITION BY id) cnt,
            SUM(CASE WHEN code LIKE '%6' THEN 1 ELSE 0 END) OVER(PARTITION BY id) sm
        FROM  table_a 
  )
WHERE cnt = sm  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...