Как найти различия в количестве для идентификаторов в двух больших таблицах - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть две большие таблицы. Оба содержат около 17 миллионов строк. У них должно быть одинаковое точное количество строк, но я считаю, что количество отличается на 343. Я хочу выяснить, где количество отличается. Таблицы выглядят так:

Таблица A

ID | color
---| ---------
1  | red
1  | green
1  | blue
2  | white
3  | black
3  | red

Таблицы B

ID | sale_dates
---| ----------
1  | 2020-10-01
1  | 2020-01-10
2  | 2018-01-09
3  | 2017-08-08

Исходя из вышеизложенного, я хотел бы вывод, как показано ниже:

ID | Table A | Table B | Difference
---| --------| --------| ----------
1  | 5       | 2       | 3
2  | 1       | 1       | 0
3  | 2       | 1       | 1

Или даже узнать только те, где разница не 0

Ответы [ 2 ]

3 голосов
/ 30 апреля 2020

Если две таблицы всегда будут иметь одинаковый набор значений ID, вы можете просто JOIN две производные таблицы значений COUNT(*), чтобы получить желаемый результат:

SELECT A.ID,
       "Table A",
       "Table B",
       "Table A" - "Table B" AS Difference
FROM (
  SELECT ID, COUNT(*) AS "Table A"
  FROM A
  GROUP BY ID
) A
JOIN (
  SELECT ID, COUNT(*) AS "Table B"
  FROM B
  GROUP BY ID
) B ON A.ID = B.ID
ORDER BY A.ID

Вывод:

id  Table A     Table B     difference
1   3           2           1
2   1           1           0
3   2           1           1

Демонстрация по dbfiddle

Если вы хотите, чтобы значения ID имели ненулевую разницу, добавьте

WHERE "Table A" - "Table B" > 0

до предложения ORDER BY.

Демонстрация по dbfiddle

1 голос
/ 30 апреля 2020

Это твик в ответе Ника. Я думаю, что full join очень важно в такой ситуации, потому что вполне возможно, что некоторые идентификаторы отсутствуют в одной или другой таблице:

SELECT ID, a.cnt, b.cnt,
       (COALESCE(a.cnt, 0) - COALESCE(b.cnt, 0)) as difference
FROM (SELECT UPPER(ID) as id, COUNT(*) AS cnt
      FROM A
      GROUP BY UPPER(ID)
     ) A FULL JOIN
     (SELECT UPPER(ID) as id, COUNT(*) AS cnt
      FROM B
      GROUP BY UPPER(ID)
     ) B 
     USING (ID)
ORDER BY difference DESC;

Добавить:

WHERE COALESCE(a.cnt, 0) <> COALESCE(b.cnt)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...