如何解决如何根据创建标识符和最大日期的两列选择行
我有六列。我自己创建的六列之一。将两列放在一起以创建标识符列。我只想为标识符列的每个不同组合选择最大日期行。当我省略数量列时,我得到了预期的行数。但是,一旦我添加了数量,它就会给我我不期望的行。如何为我的 Identifier 列的每个不同出现仅选择最大日期行?
例如,当我运行此查询时...
Select
Distinct(L.ItemNo+' 'L.Lot) as Identifier,Max(L.PostingDate),L.ItemNo,L.Description,L.Quantity,L.Lot
From dbo.JournalLine L
Groupy by
L.ItemNo,L.Lot,L.Quantity
我得到以下结果。我没想到的这一排是有 45 个苹果的那排。
标识符 | 发布日期 | ItemNo | 描述 | 数量 | 批量 |
---|---|---|---|---|---|
I123 LOT123 | 2021-06-01 | I123 | 芹菜 | 79 | L123 |
I456 LOT456 | 2021-06-01 | I456 | 胡萝卜 | 25 | L456 |
I456 LOT654 | 2021-06-01 | I654 | 胡萝卜 | 21 | L654 |
I789 LOT789 | 2021-05-28 | I789 | 苹果 | 45 | L789 |
I789 LOT789 | 2021-06-01 | I789 | 苹果 | 38 | L789 |
I789 LOT555 | 2021-06-01 | I789 | 苹果 | 11 | L555 |
解决方法
使用窗口函数MAX()
和FIRST_VALUE()
分别获取最新PostingDate
行的Quantity
和PostingDate
的值:
SELECT DISTINCT
ItemNo + ' ' + Lot AS Identifier,MAX(PostingDate) OVER (PARTITION BY ItemNo,Lot,Description) AS PostingDate,ItemNo,Description,FIRST_VALUE(Quantity) OVER (PARTITION BY ItemNo,Description ORDER BY PostingDate DESC) AS Quantity,Lot
FROM dbo.JournalLine
,
GROUP BY 子句将所有包含指定列中数据的行聚集在一起(此处 GroupBy 操作在列 L.ItemNo
、L.Lot
、L.Description
和 {{ 1}}) 并将允许对一列或多列执行聚合函数(这里的聚合是在 L.Quantity
上完成的)。
因此,每条记录具有不同的 group by 列组合,即 L.PostingDate
、L.ItemNo
、L.Lot
和 L.Description
将与重复组合的聚合一起出现它。例如,考虑您的示例:-
让我们假设您的表中有以下记录:-
L.Quantity
因此,当您在 Identifier PostingDate ItemNo Description Quantity Lot
I789 LOT789 2021-05-27 I789 Apple 45 L789
I789 LOT789 2021-05-29 I789 Apple 38 L789
I789 LOT789 2021-05-25 I789 Apple 45 L789
I789 LOT789 2021-05-28 I789 Apple 45 L789
I789 LOT789 2021-06-01 I789 Apple 38. L789
I789 LOT555 2021-06-01 I789 Apple 11. L555
、Identifier
、ItemNo
、Description
和 Quantity
上执行 group by 时,SQL 会理解您想要执行这些列的逻辑分组,它将划分数据并理解如下:-
Lot
现在,当您对某个特定列上的这些记录运行任何聚合函数时,它将尝试为遇到的每个逻辑分组运行聚合函数(如我们上面所见,在这种情况下有 3 个)
所以在我们的例子中,聚合函数是 -- Group 1
Identifier PostingDate ItemNo Description Quantity Lot
I789 LOT789 2021-05-27 I789 Apple 45 L789
I789 LOT789 2021-05-25 I789 Apple 45 L789
I789 LOT789 2021-05-28 I789 Apple 45 L789
-- Group 2
Identifier PostingDate ItemNo Description Quantity Lot
I789 LOT789 2021-05-29 I789 Apple 38 L789
I789 LOT789 2021-06-01 I789 Apple 38. L789
-- Group 3
Identifier PostingDate ItemNo Description Quantity Lot
I789 LOT555 2021-06-01 I789 Apple 11. L555
,它将为它已经识别的每个组选择具有最大日期的记录,如下所示:-
Max(L.PostingDate)
现在终于合并了所有记录并显示结果如下:-
-- Group 1
Identifier PostingDate ItemNo Description Quantity Lot
I789 LOT789 2021-05-28 I789 Apple 45 L789
-- Group 2
Identifier PostingDate ItemNo Description Quantity Lot
I789 LOT789 2021-06-01 I789 Apple 38. L789
-- Group 3
Identifier PostingDate ItemNo Description Quantity Lot
I789 LOT555 2021-06-01 I789 Apple 11. L555
这就是 -- Final Ouput
Identifier PostingDate ItemNo Description Quantity Lot
I789 LOT789 2021-05-28 I789 Apple 45 L789
I789 LOT789 2021-06-01 I789 Apple 38. L789
I789 LOT555 2021-06-01 I789 Apple 11. L555
的功能,所以在您的情况下,如果您不希望 group by 在 group by
列上发生,您可以简单地从 select 查询和 groupBy 中删除它,否则,如果您包含要分组的 quantity
列,它将继续打印具有不同列组合的记录。
你可以使用窗口函数:
select * from (
select *,row_number() over (partition by ItemNo,Lot order by PostingDate desc) rn
from dbo.JournalLine
) l
where rn = 1
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。