从多个表中获取 MAX 日期时间事件,并按 ID 输出最近事件的简单列表

Posted

技术标签:

【中文标题】从多个表中获取 MAX 日期时间事件,并按 ID 输出最近事件的简单列表【英文标题】:Getting MAX datetime event from multiple tables, and outputing a simple list of most recent events by ID 【发布时间】:2021-03-25 07:19:09 【问题描述】:

我有一张桌子:

和其他多个表 - 在此示例中将它们视为购买:

并且希望输出表显示最近的购买(注意每个表中可能有多个购买实例),按主表中的 id:

例如,id 可以是客户编号。

我尝试在每个购买表上使用 OUTER APPLY,按日期时间 desc 获得 TOP 1,然后从 OUTER APPLY 表中获取最大值,但我不会得到表名 - 例如。苹果,只是日期时间。

另一个想法是将所有购买表与主表联合在一起(按 id),并挑选出前 1 个日期时间和表名,但我认为这对于很多行:

    SELECT MT.id, MT.gender, MT.age, 
        b.Name as LastPurchase, b.dt as LastPurchaseDateTime 
    FROM MainTable MT
    LEFT JOIN (
    SELECT id, Name, MAX(dt) FROM
    (
    SELECT id, 'Apples' as Name, ApplesDateTime as dt FROM ApplesTable
    UNION
    SELECT id, 'Pears' as Name, PearsDateTime as dt FROM PearsTable
    UNION
    SELECT id, 'Bananas' as Name, BananasDateTime as dt FROM BananasTable
    )a
    GROUP BY etc
    )b

有人有更明智的想法吗?

非常感谢。

【问题讨论】:

根据问题指南,请不要发布代码、数据、错误消息等的图像 - 将文本复制或键入问题中。请保留将图像用于图表或演示渲染错误,无法通过文本准确描述的事情。 【参考方案1】:

我会选择横向连接:

select m.*, x.*
from maintable m
outer apply (
    select top (1) x.*
    from (
        select id, 'apples' as name, applesdatetime as dt from applestable
        union all select id, 'pears', pearsdatetime from pearstable
        union all select id, 'bananas', bananasdatetime from bananastable
    ) x
    where x.id = m.id
    order by dt desc
) x

【讨论】:

【参考方案2】:

我建议apply:

SELECT MT.id, mt.gender, mt.age, p.*
FROM MainTable MT OUTER APPLY
     (SELECT p.name, p.dt
      FROM (SELECT id, 'Apples' as Name, ApplesDateTime as dt FROM ApplesTable
            UNION ALL
            SELECT id, 'Pears' as Name, PearsDateTime as dt FROM PearsTable
            UNION ALL
            SELECT id, 'Bananas' as Name, BananasDateTime as dt FROM BananasTable
           ) p
       WHERE p.id = mt.id
       ORDER BY dt DESC
      ) p

【讨论】:

以上是关于从多个表中获取 MAX 日期时间事件,并按 ID 输出最近事件的简单列表的主要内容,如果未能解决你的问题,请参考以下文章

从查找表中获取每个类型和每个日期的最大 ID

从 100 万行表中优化插入最大日期

MySQL 从连接表中选择 MAX 日期

使用 SQL Server 从多个表中获取期初余额

如何在 Redshift 中结合演员表和日期最大值?

从多个表中提取时 PHP while 循环和 if 语句问题