【问题标题】:SQL to Find Max date Value from each group- SQL ServerSQL 从每个组中查找最大日期值 - SQL Server
【发布时间】:2021-12-24 03:03:27
【问题描述】:

所以我有 2 个使用 Inner Join 加入的表。 表一:

Name Batch_Date AcctID
Bob 18-08-11 32
Bob 19-08-11 32
Shawn 18-08-11 42
Shawn 20-08-11 42
Paul 18-08-11 36
Paul 19-08-11 36

表 2

Code order_Date AcctID
1 18-08-11 32
0 NULL 32
0 NULL 42
0 NULL 42
1 18-08-11 36
1 18-08-11 36

所以我想从表 1 中获取名称、last batch_date、AcctID 和代码,订单日期见表2。

这里对我的挑战是因为表 2 中有多行相同的 AcctId,如果对于任何 acctid,日期列不为空,我想选择该日期,如果每一行的日期列都为空,我想要为日期选择空值。

所以结果数据集应该如下所示:

Name Batch_Date AcctID Code Order_Date
Bob 19-08-11 32 1 18-08-11
Shawn 20-08-11 42 0 NULL
Paul 19-08-11 36 1 18-08-11

【问题讨论】:

  • 这能回答你的问题吗? Get top 1 row of each group
  • @Larnu - 感谢您的快速回复。 Top 1 不起作用,因为我们可以获得相同的日期,也可以获得相同 ID 的一个空日期和一个日期。我想要是否有 1 个空值和 1 个日期 - 它应该选择日期,如果订单日期中的所有空值都应该选择空值。
  • 为什么AcctID 42的期望输出显示18-08-11,20-08-11不是最新的吗?您是要查找具有订单的最新批次,还是仅查找每个 AcctID 的最新批次和最新订单?
  • @RobertSheahan - 是的,抱歉,日期应该是 20-08-11。我希望根据帐户 ID 获取所有最新的详细信息。
  • 如果您使用该帖子 stackoverflow.com/questions/6841605/get-top-1-row-of-each-group 中的解决方案,您可以直接执行 ORDER BY order_Date DESC 并且空行将排在最后

标签: sql sql-server database case inner-join


【解决方案1】:

好的,试试这个

    --Set up your sample data in useable form, skip in your actual solution
    with cteT1 as (
         SELECT * 
         FROM (VALUES ('Bob', '18-08-11', 32), ('Bob', '19-08-11', 32)
            , ('Shawn', '18-08-11', 42), ('Shawn', '20-08-11', 42)
            , ('Paul', '18-08-11', 36), ('Paul', '19-08-11', 36)
            ) as T1 (CustName, BatchDate, AcctID)
    ), cteT2 as (
         SELECT * 
         FROM (VALUES (1, '18-08-11', 32), (0, NULL, 32), (0, NULL, 42)
            , (0, NULL, 42), (1, '18-08-11', 36), (1, '18-08-11', 36)
            ) as T2 (OrderCode, OrderDate, AcctID)
    ) 
    --Set up the solution - tag the newest of each table
    , cteTopBatches as (
        SELECT ROW_NUMBER() over (PARTITION BY AcctID ORDER BY BatchDate DESC) as BatchNewness, *
        FROM cteT1
    ), cteTopOrders as (
        SELECT ROW_NUMBER() over (PARTITION BY AcctID ORDER BY OrderDate DESC) as OrderNewness, *
        FROM cteT2 --NOTE: NULLs sort below actual dates, but you could use COALESCE to force a specific value to use, probably in another CTE for readability
    )
--Now combine the 2 tables keeping only the newest of each
SELECT T1.AcctID , T1.CustName , T1.BatchDate , T2.OrderCode , T2.OrderDate 
    FROM cteTopBatches as T1 INNER JOIN cteTopOrders as T2 ON T1.AcctID = T2.AcctID 
    WHERE T1.BatchNewness = 1 AND T2.OrderNewness = 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    • 2022-01-03
    • 2015-03-12
    • 2013-01-16
    相关资源
    最近更新 更多