如何 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=行的PostingDateQuantity的值]:

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.ItemNoL.LotL.DescriptionL.Quantity) 并将允许在一个或多个列上执行聚合函数(此处聚合在 L.PostingDate 上完成)。

因此,每个按列分组的不同组合的记录,即 L.ItemNoL.LotL.DescriptionL.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

因此,当您按 IdentifierItemNoDescriptionQuantityLot 进行分组时,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 列作为分组依据,它将继续打印具有不同列组合的记录。