Presto SQL - попытка вытащить данные из нескольких столбцов в одну запись, чтобы найти уникальную, отсутствующую или двойную запись - PullRequest
0 голосов
/ 10 апреля 2019

новый для SQL / Presto здесь.
Не стесняйтесь указывать на очевидное в случае необходимости.

У меня есть подзапрос, который вытягивает данные в таблицу, как показано ниже.
Для каждого ItemID 1 означает, что тег включен, 0 выключен.

Я пытаюсь создать запрос, который бы подтягивал каждый ItemID со связанным тегом, если он уникален, в противном случае укажите, если их больше одного или их нет.

Data_Table
| ItemID | TagA | TagB | TagC | TagD | TagE |
|  111   |  1   |  1   |  0   |  0   |  0   | 
|  222   |  1   |  1   |  1   |  0   |  0   | 
|  333   |  1   |  1   |  0   |  0   |  0   | 
|  444   |  0   |  1   |  0   |  0   |  0   | 
|  555   |  0   |  0   |  0   |  0   |  0   | 
|  666   |  0   |  0   |  0   |  1   |  1   | 

Я пробовал оператор case, который извлекает каждый 1, и другой запрос case, который пытается преобразовать каждый столбец в одну запись строки.

SELECT Item_ID,
   CASE WHEN (Tag_A+Tag_B+Tag_C+Tag_D+Tag_E > 1) THEN 'Dupe'
     ELSE (CASE WHEN Tag_A = 1 THEN 'TagA_Present'
           WHEN Tag_B = 1 THEN 'TagB_Present'
           WHEN Tag_C = 1 THEN 'TagC_Present'
           WHEN Tag_D = 1 THEN 'TagD_Present'
           WHEN Tag_E = 1 THEN 'TagE_Present'
           ELSE 'Missing_Tag' END)
     END as ItemTag
FROM Data_Table

РЕДАКТИРОВАНИЕ - Я зашел слишком далеко с примерами данных, и первоначальный запрос был изменен.

Actual Results
| ItemID | ItemTag |
|  111   |     Dupe     | 
|  222   | TagA_Present | 
|  333   | TagB_Present | 
|  444   | TagB_Present | 
|  555   |    Missing   | 
|  666   | TagD_Present | 

ItemID 111, 222, 333 и 666 должны быть «Dupe», но результаты кажутся случайными уникальными.

1 Ответ

1 голос
/ 10 апреля 2019

Хммм.Я думаю:

select t.itemId,
       (case when (TagA + TagB + TagC + TagD + TagE) > 1 then 'Dupe'
             when TagA = 1 then 'TagA'
             when TagB = 1 then 'TagB'
             when TagC = 1 then 'TagC'
             when TagD = 1 then 'TagD'
             when TagE = 1 then 'TagE'
             else 'Missing'
        end) as ItemTag
from Data_Table;

Нет причин использовать агрегацию для этого.

...