Использование Group BY или PARTITION для нескольких столбцов, где записи группируются, если ЛЮБОЙ из столбцов возвращает совпадение - PullRequest
0 голосов
/ 23 сентября 2019

Допустим, у меня есть следующая таблица:

Record_ID | Match_criteria_1 |  Match_criteria_2  | Match_criteria_3 | Dollars  

     1    |  A               |   V                |   F              |   10  
     2    |  A               |   W                |   G              |   20  
     3    |  B               |   W                |   H              |   30  
     4    |  B               |   X                |   I              |   40  
     5    |  C               |   Y                |   F              |   50  
     6    |  C               |   Z                |   J              |   60  

Если я попытаюсь использовать 'GROUP BY' или 'Over (PARTITION BY)' для Match_criteria_1, Match_criteria_2 и Match_criteria_3, я бы в итогес отдельными 6 группами / разделами.

   SELECT *, sum(Dollars) OVER (PARTITION BY Match_criteria_1, Match_criteria_2, Match_Criteria_3) AS Total_Dollars 
   FROM My_table

Record_ID | Match_criteria_1 |  Match_criteria_2  | Match_criteria_3 | Dollars     | Total_Dollars 

     1    |  A               |   V                |   F              |   10        | 10 
     2    |  A               |   W                |   G              |   20        | 20 
     3    |  B               |   W                |   H              |   30        | 30  
     4    |  B               |   X                |   I              |   40        | 40 
     5    |  C               |   Y                |   F              |   50        | 50
     6    |  C               |   Z                |   J              |   60        | 60

Как видите, ни одна из записей не имеет одинаковые Match_criteria_1, Match_criteria_2 и Match_criteria_3.

Но что, если я захочу сгруппировать записи, которые имеюттот же Match_criteria_1, Match_criteria_2 ИЛИ Match_criteria_3?

Итак, используя мой пример, запись 1 соответствует записи 2 из-за Match_criteria_1, запись 2 соответствует записи 3 из-за Match_criteria_2, запись 3 соответствует записи4 из-за Match_criteria_1, запись 5 совпадает с записью 1 из-за Match_Criteria_3, а запись 6 совпадает с записью 5 из-за Match_criteria 1 (так что происходит переходное свойство).Тогда желаемый результат:

Record_ID | Match_criteria_1 |  Match_criteria_2  | Match_criteria_3 | Dollars     | Total_Dollars 

     1    |  A               |   V                |   F              |   10        | 210 
     2    |  A               |   W                |   G              |   20        | 210 
     3    |  B               |   W                |   H              |   30        | 210  
     4    |  B               |   X                |   I              |   40        | 210 
     5    |  C               |   Y                |   F              |   50        | 210
     6    |  C               |   Z                |   J              |   60        | 210

, где Total_dollars - это сумма каждой записи из-за того, что все шесть политик совпадают друг с другом из-за транзитивности.Таким образом, записи 1 и 6 могут не иметь общих критериев соответствия, но они по-прежнему сгруппированы, поскольку обе они соответствуют записи 5.

1 Ответ

0 голосов
/ 23 сентября 2019

Возможно, я неправильно понимаю это, но я думаю, что вы могли бы просто получить общие доллары для всех строк, которые соответствуют другим строкам, и присоединиться к этому?Я не уверен, какой именно ожидаемый результат должен быть, если строка не совпадает.Этот ответ будет по-прежнему включать эту строку, но общая сумма в долларах не будет включать сумму в этой строке.

SELECT test.*, total_dollars 
FROM test, 
    (SELECT sum(dollars) as total_dollars 
     FROM (select distinct test.* FROM test
     JOIN test test2 ON (ARRAY[test.match_criteria_1, test.match_criteria_2, test.match_criteria_3] && ARRAY[test2.match_criteria_1, test2.match_criteria_2, test2.match_criteria_3])
     AND test.record_id != test2.record_id order by 1
    ) sub)
sub2;

Я добавил еще одну строку, которая не должна совпадать ни с одной из других: вставьте в тест ЗНАЧЕНИЯ (7, 'M', 'N', 'O', 100);

и вот результаты:

 record_id | match_criteria_1 | match_criteria_2 | match_criteria_3 | dollars | total_dollars
-----------+------------------+------------------+------------------+---------+---------------
         1 | A                | V                | F                |      10 |           210
         2 | A                | W                | G                |      20 |           210
         3 | B                | W                | H                |      30 |           210
         4 | B                | X                | I                |      40 |           210
         5 | C                | Y                | F                |      50 |           210
         6 | C                | Z                | J                |      60 |           210
         7 | M                | N                | O                |     100 |           210
(7 rows)
...