如何在SELECT查询中排除第三行记录(表含3条及以上数据时)
解决方案:过滤总记录数≥3时的第三行
我来帮你搞定这个需求!你需要保留所有行数据,仅当总记录数达到3条或更多时排除第三行,还不能用GROUP BY——窗口函数刚好能完美解决这个问题,完全不需要聚合操作。
实现思路
- 用
ROW_NUMBER()按PurchaseOrder_AuthID升序给每条记录编行号,准确定位哪一行是第三行 - 用
COUNT(*) OVER ()计算当前查询的总记录数,判断是否需要执行过滤逻辑 - 最后通过条件过滤,仅在总记录数≥3时排除行号为3的记录,其他情况保留所有行
完整SQL语句
WITH OrderedRecords AS ( SELECT POA.PurchaseOrder_AuthID, POA.Authorised, wc.Name, POA.DateAuthorised, POA.DelayEscalationSentAt, POA.AuthorisingContactID, -- 按PurchaseOrder_AuthID升序生成行号 ROW_NUMBER() OVER (ORDER BY POA.PurchaseOrder_AuthID ASC) AS RowNum, -- 计算当前查询的总记录数 COUNT(*) OVER () AS TotalRows FROM dbo.wsm_PurchaseOrder_Auth AS POA INNER JOIN wsm_Contact AS WC ON POA.AuthorisingContactID = wc.ContactID WHERE POA.PONumber = 'PO3841905_51_200908' ) SELECT PurchaseOrder_AuthID, Authorised, Name, DateAuthorised, DelayEscalationSentAt, AuthorisingContactID FROM OrderedRecords -- 核心过滤逻辑:总记录数≥3时排除第三行,否则保留所有行 WHERE NOT (TotalRows >= 3 AND RowNum = 3) ORDER BY PurchaseOrder_AuthID ASC;
方案适配性说明
- 全程不需要
GROUP BY和聚合函数,所有原始行的字段数据都能完整保留 - 不管第二行和第三行的
AuthorisingContactID是否相同,逻辑都能正常生效 - 行号和总记录数基于当前查询结果动态计算,能适配不同数量的记录场景
内容的提问来源于stack exchange,提问作者user9461718
相关产品推荐
相关产品推荐

