如何 select 行基于创建标识符和最大日期的两列
How to select rows based on two columns creating an identifier and the max date
我有六列。我自己创建的六个专栏之一。它是两个列放在一起以创建标识符列。我只想 select 标识符列的每个不同组合的最大日期行。当我省略数量列时,我得到了预期的行数。但是,一旦我添加了数量,它就会给出我不期望的行。我如何 select 仅为标识符列的每个不同出现的最大日期行?
例如,当我运行这个查询...
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.Description
,L.Quantity
我得到以下结果。我没想到的那一行是有 45 个苹果的那一行。
标识符
发布日期
物品编号
描述
数量
很多
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
使用window函数MAX()
和FIRST_VALUE()
分别得到最新[=13=行的PostingDate
和Quantity
的值]:
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, Lot, Description ORDER BY PostingDate DESC) AS Quantity,
Lot
FROM dbo.JournalLine
你可以使用window函数:
select * from (
select * , row_number() over (partition by ItemNo,Lot order by PostingDate desc) rn
from dbo.JournalLine
) l
where rn = 1
GROUP BY 子句将所有包含指定列中数据的行聚集在一起(这里的 GroupBy 操作是在列 L.ItemNo
、L.Lot
、L.Description
和L.Quantity
) 并将允许在一个或多个列上执行聚合函数(此处聚合在 L.PostingDate
上完成)。
因此,每个按列分组的不同组合的记录,即 L.ItemNo
、L.Lot
、L.Description
和 L.Quantity
将与副本上的聚合一起出现它的组合。例如,考虑您的示例:-
让我们假设您的 table 中有以下记录:-
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
和 Lot
进行分组时,SQL 就会明白你想对这些列进行逻辑分组,它将划分数据并理解如下:-
-- 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
现在,当您在某些特定列的这些记录上使用任何聚合函数 运行 时,它将尝试 运行 它遇到的每个逻辑分组的聚合函数(此中有 3 个我们上面看到的情况)
所以在我们的例子中,聚合函数是 Max(L.PostingDate)
它将 select 到现在它已经识别的每个组的最大日期记录,如下所示:-
-- 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
的运作方式,所以在您的情况下,如果您不希望分组依据发生在 quantity
列上,您只需将其从 select 中删除查询以及 groupBy,否则如果您包含 quantity
列作为分组依据,它将继续打印具有不同列组合的记录。
我有六列。我自己创建的六个专栏之一。它是两个列放在一起以创建标识符列。我只想 select 标识符列的每个不同组合的最大日期行。当我省略数量列时,我得到了预期的行数。但是,一旦我添加了数量,它就会给出我不期望的行。我如何 select 仅为标识符列的每个不同出现的最大日期行?
例如,当我运行这个查询...
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.Description
,L.Quantity
我得到以下结果。我没想到的那一行是有 45 个苹果的那一行。
标识符 | 发布日期 | 物品编号 | 描述 | 数量 | 很多 |
---|---|---|---|---|---|
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 |
使用window函数MAX()
和FIRST_VALUE()
分别得到最新[=13=行的PostingDate
和Quantity
的值]:
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, Lot, Description ORDER BY PostingDate DESC) AS Quantity,
Lot
FROM dbo.JournalLine
你可以使用window函数:
select * from (
select * , row_number() over (partition by ItemNo,Lot order by PostingDate desc) rn
from dbo.JournalLine
) l
where rn = 1
GROUP BY 子句将所有包含指定列中数据的行聚集在一起(这里的 GroupBy 操作是在列 L.ItemNo
、L.Lot
、L.Description
和L.Quantity
) 并将允许在一个或多个列上执行聚合函数(此处聚合在 L.PostingDate
上完成)。
因此,每个按列分组的不同组合的记录,即 L.ItemNo
、L.Lot
、L.Description
和 L.Quantity
将与副本上的聚合一起出现它的组合。例如,考虑您的示例:-
让我们假设您的 table 中有以下记录:-
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
和 Lot
进行分组时,SQL 就会明白你想对这些列进行逻辑分组,它将划分数据并理解如下:-
-- 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
现在,当您在某些特定列的这些记录上使用任何聚合函数 运行 时,它将尝试 运行 它遇到的每个逻辑分组的聚合函数(此中有 3 个我们上面看到的情况)
所以在我们的例子中,聚合函数是 Max(L.PostingDate)
它将 select 到现在它已经识别的每个组的最大日期记录,如下所示:-
-- 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
的运作方式,所以在您的情况下,如果您不希望分组依据发生在 quantity
列上,您只需将其从 select 中删除查询以及 groupBy,否则如果您包含 quantity
列作为分组依据,它将继续打印具有不同列组合的记录。