2017-08-03 52 views
1

我正试图在同一个表中的3列中查找重复的数据。我正在寻找具有相同参考号的任何订单,前提条件& DatePlaced。如何查找表中的重复数据

例如,由于所有三个标准都得到满足,因此将显示DatePlaced 02/08/17从PremiseId 67890的参考号为12345的订单。

这是我到目前为止,这是从本网站上的另一个答案采取的。

SELECT ReferenceNumber, PremiseId, DatePlaced 
FROM [ypolive_Integration].[dbo].[OrderHeaders] 
WHERE ReferenceNumber in 
(SELECT ReferenceNumber FROM [ypolive_Integration].[dbo].[OrderHeaders] 
GROUP BY ReferenceNumber 
HAVING COUNT(*)>1) 

Order By DatePlaced desc 

这是返回结果ReferenceNumber,PremiseId & DatePlaced。但是,这显示了所有数据,我只希望它显示符合所有三个条件的重复项。

我在这种事情上是非常多的新手,所以如果这是完全错误的道歉!

现在这解决了下面的代码:

select ReferenceNumber, PremiseId , CONVERT(VARCHAR(10),DatePlaced, 112) as 
DatePlaced,count(1) as cnt 
from [ypolive_Integration].[dbo].[OrderHeaders] 
group by ReferenceNumber, PremiseId , CONVERT(VARCHAR(10),DatePlaced, 112) 
having count(1) > 1 
order by DatePlaced desc 
+0

你使用MySQL或MS SQL Server?不要标记不涉及的产品。 – jarlh

+0

你可以参考这个链接获得一些想法https://stackoverflow.com/a/2594855/7083586 – Zaza

+0

更新你的问题添加一个适当的数据样本和预期的结果 – scaisEdge

回答

1

请尝试以下查询

select ReferenceNumber, PremiseId , CONVERT(VARCHAR(10),DatePlaced, 112) as 
DatePlaced,count(1) as cnt 
from [ypolive_Integration].[dbo].[OrderHeaders] 
group by ReferenceNumber, PremiseId , CONVERT(VARCHAR(10),DatePlaced, 112) 
having count(1) > 1 
+0

嗨,代码运行时提供了以下错误: 消息402,级别16,状态1,行3 数据类型int和datetime是不兼容的运营商。 –

+0

试试我现在发布的代码 – Aparna

+0

是否有效?结果如预期的那样? – Aparna

1

可以如下查询:

Select * from (
    SELECT --ReferenceNumber, PremiseId, DatePlaced, 
      * 
      ,RowN = Row_Number() over (partition by ReferenceNumber, PremiseId order by DatePlaced desc) 
    FROM [ypolive_Integration].[dbo].[OrderHeaders] 
) a 
Where a.RowN > 1 
+0

嗨,谢谢你的回复。 这将返回以下代码: 'ReferenceNumber'列多次为'a'指定。 –

+0

据此更新 –

-1

尝试使用此查询:

SELECT ReferenceNumber, PremiseId, DatePlaced 
FROM [ypolive_Integration].[dbo].[OrderHeaders] 
WHERE ReferenceNumber in 
(SELECT ReferenceNumber FROM [ypolive_Integration].[dbo].[OrderHeaders] 
GROUP BY ReferenceNumber HAVING COUNT(*)>1) 
AND PremiseId in (SELECT PremiseId FROM [ypolive_Integration].[dbo].[OrderHeaders] GROUP BY PremiseId HAVING COUNT(*)>1) 
AND DatePlaced in (SELECT DatePlaced FROM [ypolive_Integration].[dbo].[OrderHeaders] GROUP BY DatePlaced HAVING COUNT(*)>1) 
+0

这种方式过于复杂,你不觉得吗? –

+0

但我不认为有任何其他方式可以这样做:) –

+0

这就是为什么CTE是您在这里的最佳选择,只需检查我的答案,我放在那里的解决方案在SQL Server开发人员中使用很多,设置和读取 - >易于调试一段时间后 –

0
WITH [Select_Dups] AS(
SELECT [RN] = ROW_NUMBER() OVER (PARTITION BY [ReferenceNumber], [PremiseId], [DatePlaced] ORDER BY [ReferenceNumber]), 
[ReferenceNumber], [PremiseId], [DatePlaced] 
FROM [ypolive_Integration].[dbo].[OrderHeaders] 
) 
SELECT [ReferenceNumber], [PremiseId], [DatePlaced] 
FROM [Select_Dups] 
WHERE [RN] > 1 

或类似的,如果你只是日期(没有时间)后:

WITH [Select_Dups] AS(
SELECT [RN] = ROW_NUMBER() OVER (PARTITION BY [ReferenceNumber], [PremiseId], CAST([DatePlaced] as date) ORDER BY [ReferenceNumber]), 
[ReferenceNumber], [PremiseId], [Date] = CAST([DatePlaced] as date) 
FROM [ypolive_Integration].[dbo].[OrderHeaders] 
) 
SELECT [ReferenceNumber], [PremiseId], [Date] 
FROM [Select_Dups] 
WHERE [RN] > 1 
0
SELECT ReferenceNumber 
    ,PremiseId 
    ,DatePlaced 
    ,convert(VARCHAR(100), ReferenceNumber) + ' - ' + convert(VARCHAR(100), PremiseId) + ' - ' + convert(VARCHAR(100), DatePlaced, 121) combined --Remove this line if not needed 
FROM [ypolive_Integration].[dbo].[OrderHeaders] 
WHERE convert(VARCHAR(100), ReferenceNumber) + ' - ' + convert(VARCHAR(100), PremiseId) + ' - ' + convert(VARCHAR(100), DatePlaced, 121) IN (
     SELECT convert(VARCHAR(100), ReferenceNumber) + ' - ' + convert(VARCHAR(100), PremiseId) + ' - ' + convert(VARCHAR(100), DatePlaced, 121) combined 
     GROUP BY convert(VARCHAR(100), ReferenceNumber) + ' - ' + convert(VARCHAR(100), PremiseId) + ' - ' + convert(VARCHAR(100), DatePlaced, 121) 
     HAVING COUNT(*) > 1 
     ) 
ORDER BY DatePlaced DESC 
+0

只需更改“convert(varchar(100)”长度并根据需要删除第一个组合语句 – Shane