【问题标题】:SQL Server: SELECT rows with MAX(Column A), MAX(Column B), DISTINCT by related columnsSQL Server:按相关列选择具有 MAX(A 列)、MAX(B 列)、DISTINCT 的行
【发布时间】:2023-03-14 00:06:01
【问题描述】:

场景:

A表
MasterID、添加日期、添加者、更新日期、更新者、
1,2010 年 1 月 1 日,“弗雷德”,空,空
2,2010 年 1 月 2 日,“巴尼”,“先生。石板',2010 年 1 月 7 日
3,2010 年 1 月 3 日,“无名”,空,空

表B
MasterID、添加日期、添加者、更新日期、更新者、
1,2010 年 1 月 3 日,“威尔玛”,“伟大的卡祖笛”,2010 年 1 月 5 日
2,2010 年 1 月 4 日,“贝蒂”,“迪诺”,2010 年 1 月 4 日

表 C
MasterID、添加日期、添加者、更新日期、更新者、
1,2010 年 1 月 5 日,“鹅卵石”,空,空
2,2010 年 1 月 6 日,'BamBam',空,空

表 D
MasterID、添加日期、添加者、更新日期、更新者、
1,2010 年 1 月 2 日,“无名”,空,空
3,2010 年 1 月 4 日,“威尔玛”,空,空

当表 A、B、C&D 是 UNION 时,我需要返回每个不同记录的最大添加日期和相应用户,以及最大更新日期和相应用户,即:
1,2010 年 1 月 5 日,“鹅卵石”,“大卡祖笛”,2010 年 1 月 5 日
2, 1/6/2010, 'BamBam', 'Mr.石板',2010 年 1 月 7 日
3,2010 年 1 月 4 日,“威尔玛”,空,空

我知道如何使用每行一个日期/用户来执行此操作,但有两个超出了我的范围。
DBMS 是 SQL Server 2005。首选 T-SQL 解决方案。

在此先感谢,
戴夫

【问题讨论】:

    标签: sql-server tsql union max


    【解决方案1】:

    与每行一个日期/用户一样,并重复修改日期,然后在 MasterID 上将两个结果表连接在一起。

    SELECT added.MasterID, added.AddedDate, added.AddedBy, modif.UpdatedDate, modif.UpdatedBy FROM
    (
    SELECT a.MasterID, a.AddedDate, b.AddedBy FROM
    (
        SELECT MasterID, Max(AddedDate) As AddedDate FROM
        (
            SELECT * FROM TableA
            UNION ALL
            SELECT * FROM TableB
            UNION ALL
            SELECT * FROM TableC
            UNION ALL
            SELECT * FROM TableD
        )
        GROUP BY MasterID
    ) a
    JOIN
    (
            SELECT * FROM TableA
            UNION ALL
            SELECT * FROM TableB
            UNION ALL
            SELECT * FROM TableC
            UNION ALL
            SELECT * FROM TableD
    ) b
    ON a.MasterID = b.MasterID AND a.AddedDate = b.AddedDate
    ) added
    LEFT OUTER JOIN
    (
    SELECT a.MasterID, a.UpdatedDate, b.UpdatedBy FROM
    (
        SELECT MasterID, Max(UpdatedDate) As UpdatedDate FROM
        (
            SELECT * FROM TableA
            UNION ALL
            SELECT * FROM TableB
            UNION ALL
            SELECT * FROM TableC
            UNION ALL
            SELECT * FROM TableD
        )
        GROUP BY MasterID
    ) a
    JOIN
    (
            SELECT * FROM TableA
            UNION ALL
            SELECT * FROM TableB
            UNION ALL
            SELECT * FROM TableC
            UNION ALL
            SELECT * FROM TableD
    ) b
    ON a.MasterID = b.MasterID AND a.UpdatedDate = b.UpdatedDate
    ) modif
    ON added.MasterID = modif.MasterID
    

    【讨论】:

    • 谢谢内特!!对于 SQL Server,我必须为内部 SELECT 指定派生表名。 Dave SELECT added.MasterID, added.AddedDate, added.AddedBy, modif.UpdatedDate, modif.UpdatedBy FROM ( SELECT a.MasterID, a.AddedDate, b.AddedBy FROM ( SELECT MasterID, Max(AddedDate) As addedDate FROM ( SELECT * FROM TableA UNION ALL SELECT * FROM TableB UNION ALL SELECT * FROM TableC UNION ALL SELECT * FROM TableD ) a1 -- (添加这个) GROUP BY MasterID ) a ...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 2011-10-30
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多