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

如何从Union后的两张表中筛选各tsl dte对应的最新记录?

如何合并两张销售表并筛选每日最新记录?

你需要合并SalesDetail(自动发送,标记为Mode 'A')和SalesDetailManual(手动发送,标记为Mode 'M')两张表,再筛选出每个tsl dte对应的最新inserton记录对吧?结合你给出的示例数据,我推荐用**窗口函数ROW_NUMBER()**来实现,逻辑清晰又高效,具体方案如下:

实现思路

  1. 先通过UNION ALL合并两张表(用UNION ALL比UNION更高效,因为不需要额外去重操作),同时给各自的记录加上对应的Mode标记;
  2. 对合并后的数据集,按tsl dte分组,再按inserton降序排序,用窗口函数给每组内的记录编号,最新的记录会被标记为1;
  3. 最后筛选出编号为1的记录,就是你要的每日最新数据。

完整SQL代码

WITH CombinedSales AS (
    -- 合并两张表,添加对应的Mode标记
    SELECT 
        tsl_dte, 
        sales, 
        inserton, 
        'A' AS Mode
    FROM SalesDetail
    UNION ALL
    SELECT 
        tsl_dte, 
        sales, 
        inserton, 
        'M' AS Mode
    FROM SalesDetailManual
),
RankedSales AS (
    -- 给每个tsl_dte分组的记录按inserton降序编号
    SELECT 
        *,
        ROW_NUMBER() OVER (PARTITION BY tsl_dte ORDER BY inserton DESC) AS rn
    FROM CombinedSales
)
-- 筛选出每个tsl_dte的最新记录(rn=1)
SELECT 
    tsl_dte, 
    sales, 
    inserton, 
    Mode
FROM RankedSales
WHERE rn = 1;

补充说明

  • 如果你的数据库不支持CTE(WITH语句),可以把CTE换成嵌套子查询,逻辑是完全一致的;
  • 注意确认inserton字段是日期类型,如果是字符串类型,要确保它的格式能正确排序(比如示例中的03-05-18确实比03-01-18晚),如果排序有问题,需要用CONVERT或CAST函数把字符串转成日期类型再排序;
  • 如果同一个tsl dte和inserton有多条记录(比如你示例中03-03-18有两条inserton相同的M记录),ROW_NUMBER()会随机选一条,要是想保留所有同最新日期的记录,可以把ROW_NUMBER()换成RANK()。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:43:14