Presto SQL — попытка собрать данные из нескольких столбцов в одну запись, чтобы найти уникальную, отсутствующую или дублирующую запись

#sql #presto

#sql #presto

Вопрос:

новое в 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 when, который извлекает каждый 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 должны быть «Дублированными», но результаты, похоже, считают случайные уникальными.

Ответ №1:

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

 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;
  

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

Комментарии:

1. Привет, @gordon-linoff, я зашел слишком далеко с первоначальным вопросом. Я также определял внутреннюю таблицу. С тех пор я скорректировал вопрос, чтобы сделать больше. Собираюсь попробовать ваш ввод сейчас!

2. не получается. Он по-прежнему не различает уникальные случаи. Пример ItemId 111 по-прежнему показывает один из тегов A (я предполагаю, исходя из порядка в таблице данных) вместо отображения ‘Dupe’.