【问题标题】:How do I select a max date by person in a table如何在表格中按人选择最大日期
【发布时间】:2021-09-27 04:55:26
【问题描述】:

我对 SSRS/SQL 查询不太了解,需要编写一份报告,按人提取分配百分比,然后与工资表进行比较以分配工资。这些分配每季度更改一次,但所有分配继续存储在表中。如果人员分配没有改变,他们不会在表中获得新条目。这是一个名为 Allocations 的示例表。

First Name Last Name Date Area Percent
Smith Bob 01/01/20 A 50.00
Smith Bob 01/01/20 B 50.00
Doe Jane 01/01/20 A 25.00
Doe Jane 01/01/20 B 25.00
Doe Jane 01/01/20 C 50.00
Doe Jane 04/01/20 A 35.00
Doe Jane 04/01/20 C 65.00
Wayne Bruce 01/01/20 A 100.00
Wayne Bruce 04/01/20 B 100.00

查询此示例表时我希望得到的结果是:

First Name Last Name Date Area Percent
Smith Bob 01/01/20 A 50.00
Smith Bob 01/01/20 B 50.00
Doe Jane 04/01/20 A 35.00
Doe Jane 04/01/20 C 65.00
Wayne Bruce 04/01/20 B 100.00

但是,我还想通过将其与用户输入的日期进行比较来提取它,以便他们可以在任何时间点运行此报告并获得正确的“最大”日期。因此,例如,如果这里还有 2020 年 7 月 1 日的日期,但用户输入的日期是 20 年 6 月 30 日,我不想提取 20 年 7 月 1 日的数据。换句话说,我想按名称提取具有最大日期的行,而不会超过用户的输入日期。

你有什么好的方法来实现这一点吗?

提前感谢您提供的任何建议。

【问题讨论】:

    标签: sql date filter reporting-services max


    【解决方案1】:

    在 SQL 中,ROW_NUMBER 可用于按特定字段对组中的记录进行排序。

    SELECT * FROM (
    SELECT *, ROW_NUMBER()OVER(PARTITION BY Last_Name, First_Name ORDER BY DATE DESC) as ROW_NUM 
    FROM TABLE
    ) AS T
    WHERE ROW_NUM = 1
    

    然后你过滤ROW_NUM = 1

    但是,我注意到有一对夫妇的日期相同,而您两者都想要。在这种情况下,您需要使用 RANK - 它允许平局,因此您可能要捕获多个具有相同日期的记录。

    SELECT * FROM (
    SELECT *, RANK()OVER(PARTITION BY Last_Name, First_Name ORDER BY DATE DESC) as ROW_NUM 
    FROM TABLE
    ) AS T
    WHERE ROW_NUM = 1
    

    【讨论】:

    • 嗨,非常感谢。在其他人的建议下发布此内容之前,我实际上已经尝试过 ROW,但无法获得准确的结果。如何过滤 RANK 以获取日期的所有适当行?当我仍然过滤 WHERE ROW_NUM = 1 时,并不是我的所有结果都显示出来。有些人可能有 1 行结果,而其他人可能有更多,这取决于他们的分配方式。
    • @SeanBarry - 我得到两个给 Bob 和 Jane,一个给 Bruce,使用 Rank = 1。
    猜你喜欢
    • 2021-01-02
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-11
    • 2010-12-11
    • 1970-01-01
    • 2023-03-25
    相关资源
    最近更新 更多