выбрать уникальные совпадающие строки в SQL на основе двух столбцов - PullRequest
0 голосов
/ 07 мая 2019

У меня есть таблица с 314 044 452 строками, которая выглядит следующим образом:

id1   id2   amount
---- ----   ------
a     A     2
a     A     1
a     A     3
b     B     1
b     B     5
c     A     6
c     A     6
d     F     2
d     F     3
d     F     4

Я хотел бы вернуть таблицу, в которой возвращаются только уникальные соответствия, основанные на id2, то есть строки с A не возвращаются. Плюс сумма равна сумме строк:

id1 id2 amount
--- --- ------
b   B    6
d   F    9

Возможно ли это одним запросом?

Ответы [ 6 ]

0 голосов
/ 07 мая 2019

Перед группировкой и суммированием необходимо исключить строки, в которых вы не хотите участвовать, и вы можете сделать это с помощью NOT EXISTS:

select
   t.id1, 
   t.id2,
   sum(t.amount) amount
from (
  select t.* from tablename t
  where not exists (
    select 1 from tablename
    where id1 <> t.id1 and id2 = t.id2
  )
) t
group by t.id1, t.id2

См. Демонстрационную версию .

| id1 | id2 | amount |
| --- | --- | ------ |
| b   | B   | 6      |
| d   | F   | 9      |
0 голосов
/ 07 мая 2019

Этот запрос возвращает ожидаемый результат для данного набора данных выборки-

WITH A (id1,id2,amount)
AS
(
    SELECT 'a','A',2
    UNION ALL
    SELECT 'a','A',1
    UNION ALL
    SELECT 'a','A',3
    UNION ALL
    SELECT 'b','B',1
    UNION ALL
    SELECT 'b','B',5
    UNION ALL
    SELECT 'c','A',6
    UNION ALL
    SELECT 'c','A',6
    UNION ALL
    SELECT 'd','F',2
    UNION ALL
    SELECT 'd','F',3
    UNION ALL
    SELECT 'd','F',4
)
SELECT id1,id2,SUM(amount)
FROM A
WHERE id2 <> 'A'
GROUP BY id1,id2
0 голосов
/ 07 мая 2019

Попробуйте что-то вроде следующего:

   SELECT DISTINCT id2, SUM(amount) from "tablename"
   group by id2

Дайте мне знать, если мне не хватает того, что вы ищете.

0 голосов
/ 07 мая 2019

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

select id1,id2,sum(amount) as amount
from 
<table> t 
join (
    select id2
    from <table>
    group by 1
    having count(distinct id1)=1
) unique_groups
on t.id2=unique_groups.id2
group by 1,2

с учетом количества строк, я бы фактически создал промежуточную таблицу сunique pairs сначала, а затем присоедините его к исходной таблице.если это не работает или занимает слишком много времени, вы можете разбить его дальше - сначала материализовать отличное id1, id2, затем материализовать unique_groups и затем выполнить запрос

0 голосов
/ 07 мая 2019
SELECT MAX(id1), id2, SUM(amount) amount
FROM <table>
GROUP id2
HAVING COUNT(DISTINCT id1) = 1;

Это удалить A, потому что есть id1 = {a,c}

0 голосов
/ 07 мая 2019

Это вы ищете?

select id1, id2, sum(amount) amount
from <table>
where id2 <> 'A'
group by id1, id2;
...