Счетчик SQL (*), а затем показать столбец этих результатов - PullRequest
0 голосов
/ 11 июля 2019

Это может быть простой вопрос, но я немного борюсь с этим.

SELECT
    DAY, PLACEMENT, SECLEVEL, COUNT(*)
FROM
    SECPEOPLE
GROUP BY
    DAY, PLACEMENT, SECLEVEL
HAVING 
    COUNT(*) > 1

Возвращает дубликаты людей, которые находятся в том же месте, в тот же день и на том же уровне.

Это все хорошо, вопрос : как мне завершить этот запрос, чтобы вместо этой информации я получил уникальный идентификатор дубликатов?

В той же таблице есть уникальный столбец ID.

Ответы [ 4 ]

3 голосов
/ 11 июля 2019

Вы можете сделать это, используя аналитические функции:

SELECT id, day, placement, seclevel
FROM (
    SELECT id, day, placement, seclevel, 
           count(*) over (partition by day, placement, seclevel) as cnt
    FROM secpeople
) t
WHERE cnt > 1;
0 голосов
/ 11 июля 2019

Или, если вы хотите использовать запрос, который вы написали

SELECT *
  FROM secpeople
 WHERE (day, placement, seclevel) IN 
   (-- this is your query
    SELECT DAY, PLACEMENT, SECLEVEL
    FROM SECPEOPLE
    GROUP BY DAY, PLACEMENT, SECLEVEL
    HAVING COUNT (*) > 1
   )
0 голосов
/ 11 июля 2019

использовать объединение с cte

with cte as
(
   SELECT
        DAY, PLACEMENT, SECLEVEL, COUNT(*)
    FROM
        SECPEOPLE
    GROUP BY
        DAY, PLACEMENT, SECLEVEL
    HAVING 
        COUNT(*) > 1
    ) select a.id from cte join SECPEOPLE a on cte.DAY=a.DAY and cte.PLACEMENT=a.PLACEMENT and cte.SECLEVEL=a.SECLEVEL
0 голосов
/ 11 июля 2019

Простой способ использует exists:

SELECT p.*
FROM SECPEOPLE p
WHERE EXISTS (SELECT 1
              FROM SECPEOPLE p2
              WHERE p2.day = p.day AND
                    p2.PLACEMENT = p.PLACEMENT AND
                    p2.SECLEVEL = p.SECLEVEL AND
                    p2.<id> <> p.<id>
              )
ORDER BY DAY, PLACEMENT, SECLEVEL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...