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

基于最大日期及多条件筛选表数据的SQL实现方案咨询

问题描述

需要从表中按Inv分组筛选数据,满足以下要求:

  • 每组选取activity_date最大且Open_amt <> 0的行;
  • 若某组最大activity_date对应的行是Open_amt = 0且State = 'closed',则该组整体排除,不返回任何数据。

原SQL语句(存在问题,无返回结果):

SELECT inv,account,activity,seq,st_date,open_amt,State,activity_date 
FROM table
WHERE inv = 'test_inv'
AND State = 'issued'
AND activity_date = (select MAX (activity_date) FROM table)

表数据:

Inv #Account #ActivityStateOpen_AmtLast Activity DtSeqSt_date
123Customer1Act-1Issued12.502022-02-184552022-01-04
123Customer1Act-2Closed0.002022-03-055672022-01-04
345Customer2Act-1Issued15.002022-02-184672022-01-12
345Customer2Act-2Issued09.352022-02-254882022-01-12
678Customer3Act-1Issued30.502022-03-205892022-01-23
678Customer3Act-2Closed00.002022-03-306232022-01-23
678Customer3Act-3Issued30.502022-04-027882022-01-23
678Customer3Act-4Issued05.502022-04-109882022-01-23

期望输出:

Inv #Account #ActivityStateOpen_AmtLast Activity DtSeqSt_date
345Customer2Act-2Issued09.352022-02-254882022-01-12
678Customer3Act-4Issued05.502022-04-109882022-01-23
原SQL问题分析
  1. 硬编码inv = 'test_inv',但表中无对应数据,直接过滤全部行;
  2. 子查询MAX(activity_date)取全表最大日期,而非按Inv分组的最大日期,逻辑错误;
  3. 提前过滤State = 'issued',会漏掉需要判断的Closed状态行(比如Inv=123的最大日期行是Closed,需排除整个组)。
解决方案:使用窗口函数分组排序

用ROW_NUMBER()窗口函数按Inv分组、按activity_date降序排序,标记每组最新行后筛选符合条件的记录:

WITH ranked_data AS (
    SELECT 
        inv, account, activity, seq, st_date, open_amt, State, 
        `Last Activity Dt` AS activity_date,
        -- 按Inv分组,活动日期降序排名,每组第一为最新行
        ROW_NUMBER() OVER (PARTITION BY inv ORDER BY `Last Activity Dt` DESC) AS rn
    FROM your_table  -- 替换为实际表名
)
SELECT 
    inv AS `Inv #`, 
    account AS `Account #`, 
    activity AS Activity, 
    State, 
    open_amt AS Open_Amt, 
    activity_date AS `Last Activity Dt`, 
    seq AS Seq, 
    st_date AS St_date
FROM ranked_data
WHERE rn = 1  -- 取每组最新行
-- 排除最新行是Open_amt=0且State='Closed'的组,同时保证返回行Open_amt≠0
AND NOT (open_amt = 0 AND State = 'Closed')
AND open_amt <> 0;
逻辑说明
  1. CTE部分:给每个Inv分组内的行按活动日期降序排名,rn=1即为该组最新行;
  2. 筛选逻辑:
    • 先取每组最新行;
    • 排除最新行是Open_amt=0且State='Closed'的组;
    • 确保最终返回的行Open_amt <> 0;
  3. 针对Inv=123:最新行符合Open_amt=0且State='Closed',会被排除;
  4. 针对Inv=345和678:最新行均满足Open_amt≠0且State='Issued',会被保留,与期望输出一致。

内容的提问来源于stack exchange,提问作者user14070248

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 22:35:18