【问题标题】:Marking duplicate values in new column在新列中标记重复值
【发布时间】:2014-06-14 14:52:38
【问题描述】:

所以我需要一些关于在特定列中标记重复项的查询的帮助。

基本上我有 2 列这样的:

cust_id    Order_id
  001        001
  001        002
  001        003
  002        001
  003        001
  003        002

我想在我的 Q 中创建一个新列,将“1”标记为唯一,“0”标记为仅 cust_id 列的重复项。我的想法是使用 order_id 列上的 min 或

到目前为止,这是我想出的显然不正确的:

SELECT
A.cust_id,
B.order_id,
CASE
WHEN COUNT(A.cust_id) > 1 THEN 0
WHEN COUNT(A.cust_id) = 1 THEN 1
END AS 'TESTING'

FROM CUST A INNER JOIN ORDER B
ON B.cust_id = A.cust_id

GROUP BY B.order_id, A.cust_id

这会运行,但只会用“1”标记所有内容。我知道这是因为它完全按照我的要求做,它实际上是在查看 cust_id 的值以及为什么 ALL 都 > 1 并返回所有 '1'。

如何重写此代码以将 cust_id 的第一个实例标记为“1”,其余部分(或将 cust_id 重复为“0”

目的是让我可以在 excel 中总结 '1' 并从那里为数据透视图进行计算。

提前感谢您的帮助!!!!!!!这个网站不止一次救了我的命!

编辑:

使用 MS SQL 2008 R2

【问题讨论】:

  • 为什么这个标签是 Excel?

标签: sql excel count duplicates


【解决方案1】:
cust_id    Order_id     Unique
  001        001          1
  001        002          0 
  001        003          0
  002        001          1
  003        001          1
  003        002          0

上面的结果集是你要找的吗?下面是一个基于 AdventureWorks 数据库的示例。您获得以上所有 1 的原因是由于对客户和订单的分组。您想仅对 Cust 进行分组。

use AdventureWorks2008R2

;with CustSales as

(

select 

    C.CustomerID,

    H.SalesOrderID, 

    ROW_NUMBER() over (partition by C.CustomerID order by SalesOrderID)  as s 

from Sales.Customer C 

join Sales.SalesOrderheader H on 

C.CustomerID = H.CustomerID 

)

select 

    CustomerID,

    SalesOrderID,

    case when s = 1 then 1 else 0 end as [Unique]

from CustSales 

【讨论】:

  • 再次感谢,我能够很容易地将它嵌套到我的 Q 中,现在我在 excel 中有一个非常实用的表格,我可以用它来为我的所有数据透视表提供动力,因此只需要一个切片器来供电所有表。即:现在不是每个图表都有员工切片器,而是一个切片器控制所有适用的图表。
  • 我不得不承认我不太明白 row_number... 行发生了什么,所以我想我还有一些研究要做。我知道我给原始 Q 起了一个别名,然后从那里开始工作。我是新手,这对我来说是第一次。我只想做一个包,但被告知需要在一个查询中完成。
  • Row_Number() 生成一系列数字,其值取决于所选列。因此,对于每个 customerID(分区)块,都会生成与“按 SalesOrderID 排序”的顺序匹配的有序数字序列。查找窗口函数:technet.microsoft.com/en-us/library/ms189461(v=sql.105).aspx
【解决方案2】:
SELECT t1.*, CASE s.num WHEN 1 THEN 1 ELSE 0 END uniq
  FROM Table1 t1
    JOIN (SELECT cust_id, COUNT(*) num FROM Table1 GROUP BY cust_id) s
      ON s.cust_id = t1.cust_id

SQLFiddle

【讨论】:

  • 这不包含与 Order 表的连接,因此也不包含 order_id。 cust_id 是独一无二的,它自己没有欺骗。只有当我向客户下订单时,我才会得到客户的重复订单。
  • 使用 MS SQL 2008 r2,不确定是否有所作为,但 SQLFiddle 不适合它
猜你喜欢
  • 2016-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-06
  • 1970-01-01
相关资源
最近更新 更多