Выберите строки, которые имеют два одинаковых столбца, но другой, если они имеют несколько кортежей - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть таблица базы данных с этими столбцами:

local  domain  email_sha256  password  password_sha256
a      b       ...           C         ...
a      bb      ...           C         ...
a      bb      ...           CC        ...
a      bbb     ...           C         ...
aa     bb      ...           CCC       ...
aa     bb      ...           CC        ...

Часть local и domain - это, по сути, электронная почта, разделенная на символ @.

test@gmail.com

local = test

domain = gmail.com

Я хочу найти все строки с одинаковыми local и password пара, но есть другой domain.Это вернуло бы что-то вроде, если бы я взял только столбцы local, domain и password

local  domain  password
a      b       C
a      bb      C
a      bbb     C

Я пытался сначала идентифицировать все пары local, password, которыеесть дубликаты, с:

SELECT local, password 
FROM tablename
GROUP BY local, password
HAVING count(*) > 1

Теперь, чтобы получить больше столбцов, чем просто GROUP BY Я делаю JOIN для самой таблицы

SELECT local, domain, password 
FROM tablename
JOIN (SELECT local, domain FROM tablename GROUP BY local, password HAVING count(*) > 1)
USING (local, password)

Теперь, чтобы убедиться, чтодомен другой. Я снова присоединяюсь к таблице и добавляю предложение WHERE.Чтобы избежать повторения, я использую GROUP BY.Вот мой последний запрос.

SELECT A.local, A.domain, A.password
FROM tablename as A
JOIN 
    (SELECT  local, domain, password 
    FROM tablename
    JOIN 
        (SELECT local, password 
        FROM tablename 
        GROUP BY local, password 
        HAVING count(*) > 1) 
    USING (local, password)) as B
USING (local, password)
WHERE A.password = B.password AND A.domain != B.domain AND A.local = B.local
GROUP BY local, domain, password
ORDER BY local, password

Я удаляю потенциальные действительные результаты с этим запросом?Кроме того, есть ли более быстрый / лучший запрос для выполнения и достижения того же результата?

Спасибо.

Примечание. Эта таблица не имеет уникальных идентификаторов, но у меня, вероятно, нет дубликатов email_sha256, password_sha256 пар, чтобы их можно было использовать в качестве идентификатора.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Я хочу найти все строки с одинаковой парой локальных паролей, но с другим доменом.

Я думаю, вы можете сделать:

select t.* except (min_domain, max_domain)
from (select t.*,
             min(domain) over (partition by local, password) as min_domain,
             max(domain) over (partition by local, password) as max_domain
      from tablename t
     ) t
where min_domain <> max_domain;
0 голосов
/ 07 февраля 2019

Ниже для BigQuery Standard SQL

#standardSQL
WITH remove_dup_domains AS (
  SELECT rec.* FROM (
    SELECT local, domain, password, ANY_VALUE(t) rec
    FROM `project.dataset.table` t
    GROUP BY local, domain, password
  )
)
SELECT y.* FROM (
  SELECT ARRAY_AGG(t) bin 
  FROM remove_dup_domains t
  GROUP BY local, password
  HAVING COUNT(1) > 1
)x, x.bin y

Вы можете протестировать, поиграть с выше, используя примеры данных из вашего вопроса, как в примере ниже

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 'a' local, 'b' domain, 'C' password, 'whatever else1' other_cols UNION ALL
  SELECT 'a', 'bb', 'C', 'whatever else2' UNION ALL
  SELECT 'a', 'bb', 'CC', 'whatever else3' UNION ALL
  SELECT 'a', 'bbb', 'C', 'whatever else4' UNION ALL
  SELECT 'a', 'bbbb', 'D', 'whatever else5' UNION ALL
  SELECT 'a', 'bbbbb', 'E', 'whatever else6' UNION ALL
  SELECT 'aa', 'bb', 'CCC', 'whatever else7' UNION ALL
  SELECT 'aa', 'bb', 'CC', 'whatever else8' UNION ALL
  SELECT 'aaa', 'com', 'H', 'whatever else9' UNION ALL
  SELECT 'aaa', 'com', 'H', 'whatever else10' 
), remove_dup_domains AS (
  SELECT rec.* FROM (
    SELECT local, domain, password, ANY_VALUE(t) rec
    FROM `project.dataset.table` t
    GROUP BY local, domain, password
  )
)
SELECT y.* FROM (
  SELECT ARRAY_AGG(t) bin 
  FROM remove_dup_domains t
  GROUP BY local, password
  HAVING COUNT(1) > 1
)x, x.bin y   

с результатом

Row local   domain  password    other_cols   
1   a       b       C           whatever else1   
2   a       bb      C           whatever else2   
3   a       bbb     C           whatever else4    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...