如何从Union后的两张表中筛选各tsl dte对应的最新记录?
如何合并两张销售表并筛选每日最新记录?
你需要合并SalesDetail(自动发送,标记为Mode 'A')和SalesDetailManual(手动发送,标记为Mode 'M')两张表,再筛选出每个tsl dte对应的最新inserton记录对吧?结合你给出的示例数据,我推荐用**窗口函数ROW_NUMBER()**来实现,逻辑清晰又高效,具体方案如下:
实现思路
- 先通过
UNION ALL合并两张表(用UNION ALL比UNION更高效,因为不需要额外去重操作),同时给各自的记录加上对应的Mode标记; - 对合并后的数据集,按
tsl dte分组,再按inserton降序排序,用窗口函数给每组内的记录编号,最新的记录会被标记为1; - 最后筛选出编号为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
相关产品推荐
相关产品推荐

