You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SELECT查询中排除第三行记录(表含3条及以上数据时)

解决方案:过滤总记录数≥3时的第三行

我来帮你搞定这个需求!你需要保留所有行数据,仅当总记录数达到3条或更多时排除第三行,还不能用GROUP BY——窗口函数刚好能完美解决这个问题,完全不需要聚合操作。

实现思路

  1. 用ROW_NUMBER()按PurchaseOrder_AuthID升序给每条记录编行号,准确定位哪一行是第三行
  2. 用COUNT(*) OVER ()计算当前查询的总记录数,判断是否需要执行过滤逻辑
  3. 最后通过条件过滤,仅在总记录数≥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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:47:04