Select 多列筛选的最新行
Select most recent row filtered on multiple columns
我有一个sqltable
+------+-----------+-----------+--------+--------------+
| rowID| location | fk_Item_ID |Balance |Inventory_Date|
+------+-----------+-----------+--------+--------------+
| 1 | 1 | p1 |500 |2019-01-10 |
| 2 | 1 | p2 |450 |2019-01-05 |
| 3 | 2 | p2 |500 |2019-01-10 |
| 4 | 1 | p1 |300 |2019-01-15 |
| 5 | 1 | p1 |350 |2019-01-16 |
+------+-----------+-----------+--------+--------------+
我正在尝试编写一个 SQL 语句或最好是 LINQ 以按日期获取最近的行,然后是每个位置每个部分的最大行号
SELECT * FROM Inventory_Log AS l1
WHERE
rowID IN (
SELECT MAX(rowID) FROM Inventory_Log
WHERE
fk_Item_ID = l1.fk_Item_ID
AND Inventory_Date = (
SELECT MAX(Inventory_Date)
FROM Inventory_Log
WHERE fk_Item_ID = l1.fk_Item_ID
)
)
ORDER by l1.fk_Item_ID
预期结果:
+------+-----------+-----------+--------+--------------+
| rowID| location | fk_Item_ID |Balance |Inventory_Date|
+------+-----------+-----------+--------+--------------+
| 2 | 1 | p2 |450 |2019-01-05 |
| 3 | 2 | p2 |500 |2019-01-10 |
| 5 | 1 | p1 |350 |2019-01-16 |
+------+-----------+-----------+--------+--------------+
我不确定如何为同一部分添加多个位置
它将放入以下 class
public class _ItemLocations
{
public string Item_ID { get; set; }
public string Location { get; set; }
public decimal Qty { get; set; }
}
我还没有在 LINQ 中尝试过,因为我正在 sql
中购买它
在SQL服务器中,使用ROW_NUMBER()
:
SELECT * FROM (
SELECT
i.*,
ROW_NUMBER() OVER(PARTITION BY location, fk_Item_ID ORDER BY Inventory_Date DESC, rowID DESC) rn
FROM Inventory_Log i
) x WHERE rn = 1
注意:我不清楚您希望使用 rowID
进行哪种排序,因为您声明要按 Inventory_Date
对记录进行排序:我将其用作第二个排序标准(因此如果需要,它将打破 Inventory_Date
上的顶级关系)。
rowID | location | fk_Item_ID | Balance | Inventory_Date | rn
----: | -------: | :--------- | ------: | :------------------ | :-
2 | 1 | p2 | 450 | 05/01/2019 00:00:00 | 1
3 | 2 | p2 | 500 | 10/01/2019 00:00:00 | 1
5 | 1 | p1 | 350 | 16/01/2019 00:00:00 | 1
我有一个sqltable
+------+-----------+-----------+--------+--------------+
| rowID| location | fk_Item_ID |Balance |Inventory_Date|
+------+-----------+-----------+--------+--------------+
| 1 | 1 | p1 |500 |2019-01-10 |
| 2 | 1 | p2 |450 |2019-01-05 |
| 3 | 2 | p2 |500 |2019-01-10 |
| 4 | 1 | p1 |300 |2019-01-15 |
| 5 | 1 | p1 |350 |2019-01-16 |
+------+-----------+-----------+--------+--------------+
我正在尝试编写一个 SQL 语句或最好是 LINQ 以按日期获取最近的行,然后是每个位置每个部分的最大行号
SELECT * FROM Inventory_Log AS l1
WHERE
rowID IN (
SELECT MAX(rowID) FROM Inventory_Log
WHERE
fk_Item_ID = l1.fk_Item_ID
AND Inventory_Date = (
SELECT MAX(Inventory_Date)
FROM Inventory_Log
WHERE fk_Item_ID = l1.fk_Item_ID
)
)
ORDER by l1.fk_Item_ID
预期结果:
+------+-----------+-----------+--------+--------------+
| rowID| location | fk_Item_ID |Balance |Inventory_Date|
+------+-----------+-----------+--------+--------------+
| 2 | 1 | p2 |450 |2019-01-05 |
| 3 | 2 | p2 |500 |2019-01-10 |
| 5 | 1 | p1 |350 |2019-01-16 |
+------+-----------+-----------+--------+--------------+
我不确定如何为同一部分添加多个位置 它将放入以下 class
public class _ItemLocations
{
public string Item_ID { get; set; }
public string Location { get; set; }
public decimal Qty { get; set; }
}
我还没有在 LINQ 中尝试过,因为我正在 sql
中购买它在SQL服务器中,使用ROW_NUMBER()
:
SELECT * FROM (
SELECT
i.*,
ROW_NUMBER() OVER(PARTITION BY location, fk_Item_ID ORDER BY Inventory_Date DESC, rowID DESC) rn
FROM Inventory_Log i
) x WHERE rn = 1
注意:我不清楚您希望使用 rowID
进行哪种排序,因为您声明要按 Inventory_Date
对记录进行排序:我将其用作第二个排序标准(因此如果需要,它将打破 Inventory_Date
上的顶级关系)。
rowID | location | fk_Item_ID | Balance | Inventory_Date | rn ----: | -------: | :--------- | ------: | :------------------ | :- 2 | 1 | p2 | 450 | 05/01/2019 00:00:00 | 1 3 | 2 | p2 | 500 | 10/01/2019 00:00:00 | 1 5 | 1 | p1 | 350 | 16/01/2019 00:00:00 | 1