Флаг создания уникального значения SQL - PullRequest
0 голосов
/ 23 ноября 2018

Существует множество вопросов / ответов о выборе уникальных значений в запросе MySQL, но я не видел ни одного при создании флага уникального значения.

У меня есть customer_ID, который может появляться более одного разав выводе запроса.Я хочу создать новый столбец, который будет указывать, является ли customer_ID уникальным или нет (0 или 1).

Вывод должен выглядеть примерно так:

ID     | Customer ID      | Unique_Flag
1      | 1234             | 1
2      | 2345             | 1
3      | 2345             | 0
4      | 5678             | 1

Пожалуйста, дайте мне знать, если кто-нибудьнуждается в разъяснениях.

Ответы [ 3 ]

0 голосов
/ 23 ноября 2018

Sample table example Вы можете использовать функцию отведения, как указано ниже, для получения необходимого выхода.

SELECT ID, CUSTOMER_ID, CASE WHEN CUSTOMER_ID != CUSTOMER_ID_NEXT THEN 1 ELSE 0 END AS UNIQUE_FLAG FROM (SELECT ID, CUSTOMER_ID,LEAD(CUSTOMER_ID, 1, 0) OVER (ORDER BY CUSTOMER_ID) AS CUSTOMER_ID_NEXT FROM TABLE)T

0 голосов
/ 23 ноября 2018

Кажется, вы хотите отметить первое вхождение как уникальное, но не другие.Итак, давайте примем значение сравнения:

select t.*,
       (id = min_id) as is_first_occurrence
from t join
     (select customer_id, min(id) as min_id
      from t
      group by customer_id
     ) tt
     on t.customer_id = tt.customer_id;

Для большинства людей флаг «уникальный» будет означать, что общее число равно «1», а не то, что это просто первое появление.Если это то, что вы хотите, то вы можете использовать аналогичную логику:

select t.*,
       (id = min_id) as is_first_occurrence,
       (cnt = 1) as is_unique
from t join
     (select customer_id, min(id) as min_id, count(*) as cnt
      from t
      group by customer_id
     ) tt
     on t.customer_id = tt.customer_id;

И в MySQL 8+ вы бы использовали оконные функции:

select t.*,
       (row_number() over (partition by customer_id order by id) = 1) as is_first_occurrence,
       (count(*) over (partition by customer_id) = 1) as is_unique
from t;
0 голосов
/ 23 ноября 2018

Вы можете попробовать ниже

select id,a.customerid, case when cnt=1 then 1 else 0 end as Unique_Flag
from tablename a 
left join 
(select customerid, count(*) as cnt from tablename
group by customerid
)b on a.customerid=b.customerid
...