【发布时间】:2015-09-07 10:43:46
【问题描述】:
我一直在玩关于重复的不同查询,但这并不是我真正需要的。我确实需要一个重复列表,但另一列中的值不同。
我正在尝试在 SQL Server 2012 中执行此操作。
我需要获取“重复”行的列表,其中 DocId 相同,但它们在表中具有不同的 PoId。
AuditId|DocMasterId|PoNumber
2224 |105 |11111
2374 |105 |11111
2574 |105 |11112
2624 |106 |232323
2874 |106 |242424
基于上述的查询应该返回
105 106
但理想情况下,如果我可以根据相同的 DocMasterId 列出每个不同 PO 的第一个和最后一个条目,那将是理想的解决方案,所以我最终会得到
AuditId|DocMasterId|PoNumber
2224 |105 |11111
2574 |105 |11112
2624 |106 |232323
2874 |106 |242424
关于如何在 SQL 中实现这一点的任何想法?
谢谢。
更新:
我应该澄清一下,我只想列出设置了 PONumber 的行,并且我希望我的结果按 DocMasterId 排序。
根据蒂姆的回答,最终结果如下:
WITH CTE AS
(
SELECT AuditId, DocMasterId, PoNumber,
RN_ASC = ROW_NUMBER() OVER (PARTITION BY DocMasterID ORDER BY
PoNumber ASC),
RN_DESC = ROW_NUMBER() OVER (PARTITION BY DocMasterID ORDER BY
PoNumber DESC),
CNT = COUNT(*) OVER (PARTITION BY DocMasterID)
FROM dbo.MyTable
WHERE PONumber IS NOT NULL
)
SELECT AuditId, DocMasterId, PoNumber
FROM CTE
WHERE CNT >= 2
AND (RN_ASC = 1 OR RN_DESC = 1)
ORDER BY DocMasterId
【问题讨论】:
-
你可以使用分组方式
-
“DocId 相同的地方.. 有不同的 PoId” 您没有显示这些列中的任何一个。 “如果我可以列出每个重复项的第一个和最后一个条目,那将是理想的解决方案” 指定 first 和 last。
-
另外:您使用的是哪个 DBMS?后格雷斯?甲骨文?
-
多个DocMasterId、PoNumber重复时如何选择AuditId? (2224 还是 2374?)
-
嗨,对不起,我已经澄清了这个问题。我是 SQL Server 2012,理想情况下,我想获取同一 DocMasterId 下列出的每个条目的第一个 PO 编号和最后一个 PO 编号记录的列表。
标签: sql sql-server