SQL Server:按相关列选择具有 MAX(A 列)、MAX(B 列)、DISTINCT 的行

发布于 2024-08-24 13:56:34 字数 844 浏览 8 评论 0原文

场景:

表 A
MasterID、添加日期、添加者、更新日期、更新者、
1, 2010 年 1 月 1 日,“弗雷德”,空,空
2、2010 年 1 月 2 日,《巴尼》、《巴尼先生》石板”,2010 年 1 月 7 日
3, 2010 年 1 月 3 日,“Noname”,null,null

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

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

表D
MasterID、添加日期、添加者、更新日期、更新者、
1, 2010 年 1 月 2 日,“Noname”,null,null
3, 1/4/2010, '威尔玛', null, null

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

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

预先感谢,
戴夫

Scenario:

Table A
MasterID, Added Date, Added By, Updated Date, Updated By,
1, 1/1/2010, 'Fred', null, null
2, 1/2/2010, 'Barney', 'Mr. Slate', 1/7/2010
3, 1/3/2010, 'Noname', null, null

Table B
MasterID, Added Date, Added By, Updated Date, Updated By,
1, 1/3/2010, 'Wilma', 'The Great Kazoo', 1/5/2010
2, 1/4/2010, 'Betty', 'Dino', 1/4/2010

Table C
MasterID, Added Date, Added By, Updated Date, Updated By,
1, 1/5/2010, 'Pebbles', null, null
2, 1/6/2010, 'BamBam', null, null

Table D
MasterID, Added Date, Added By, Updated Date, Updated By,
1, 1/2/2010, 'Noname', null, null
3, 1/4/2010, 'Wilma', null, null

I need to return the max added date and corresponding user, and max updated date and corresponding user for each distinct record when tables A,B,C&D are UNION'ed, i.e.:

1, 1/5/2010, 'Pebbles', 'The Great Kazoo', 1/5/2010
2, 1/6/2010, 'BamBam', 'Mr. Slate', 1/7/2010
3, 1/4/2010, 'Wilma', null, null

I know how to do this with one date/user per row, but with two is beyond me.
DBMS is SQL Server 2005. T-SQL solution preferred.

Thanks in advance,
Dave

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

南城旧梦 2024-08-31 13:56:34

按照每行一个日期/用户的方式进行操作,并对修改日期重复此操作,然后在 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

Do as you would with one date/user per row, and repeat for modified date, then join the two resulting tables together on the 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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文