【问题标题】:SQL Create Unique Value FlagSQL 创建唯一值标志
【发布时间】:2018-11-23 04:45:32
【问题描述】:

有很多关于在 MySQL 查询中选择唯一值的问题/答案,但我没有看到任何关于创建唯一值标志的问题。

我有一个可能在查询输出中出现多次的 customer_ID。我想创建一个新列来标记 customer_ID 是否唯一(0 或 1)。

输出应如下所示:

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

如果有人需要澄清,请告诉我。

【问题讨论】:

    标签: mysql sql unique


    【解决方案1】:

    您似乎想将第一次出现标记为唯一,而不是其他。所以,让我们加入比较值:

    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;
    

    【讨论】:

      【解决方案2】:

      你可以试试下面

      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
      

      【讨论】:

        【解决方案3】:

        您可以使用下面给出的lead函数来获得所需的输出。

        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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-08-05
          • 2011-11-01
          • 1970-01-01
          • 2012-03-26
          • 1970-01-01
          • 2011-12-17
          • 1970-01-01
          相关资源
          最近更新 更多