c# - 根据给定数量和价格的最新日期查找产品的最低和最高单价(EF Core)
问题描述
所以基本上我有一个如下表:
+----+-----------+---------+-------+-------+------------+
| ID | ProductID | ShopID | Amount| Price | AddedDate |
+----+-----------+---------+-------+-------+------------+
| 1 | 1 | 1 | 1000 | 220 | 2020-07-01 |
| 2 | 1 | 1 | 1000 | 230 | 2020-07-30 |
| 3 | 1 | 1 | 100 | 21 | 2020-07-10 |
| 4 | 1 | 1 | 100 | 22 | 2020-07-31 |
| 5 | 1 | 2 | 100 | 23 | 2020-07-10 |
| 6 | 1 | 2 | 100 | 20 | 2020-07-12 |
只需找到产品的最低价格就可以很容易地找到
lowestUnitPrice = product.Sales.Min(s => s.Price / s.Amount)
最高价格highestUnitPrice = product.Sales.Max(s => s.Price / s.Amount)
但是,如您所见,我保留了价格历史记录。因此,为了确定最低的最新单价,我只需要使用给定数量的最新条目。在上表中,它应该丢弃 ID 为 1 的行,因为 ID 为 2 的行的数量相同,但添加日期更新。
我正在尝试通过单个查询找到解决方案,但我认为这是不可能的。我认为在 SQL 中查找最低单价看起来像这样,鉴于此处的表 Sales 是特定产品的销售额。
SELECT MIN(Price / Amount)
FROM productsales
WHERE (ProductID, AddedDate) IN
(SELECT ProductID, max(AddedDate)
FROM productsales
GROUP BY ProductID, ShopID, Amount
)
上表的预期输出将是最低单价的 0.20(行 ID 6),最高单价的 0.23(行 ID 2)。
SQL演示在这里:http ://sqlfiddle.com/#!9/be74da/2
解决方案
所以一种方法是
var query = from p1 in products
where
(from p2 in products
group p2 by new { p2.ShopID, p2.Amount } into g
select (g.Max(p2 => p2.AddedDate))
).Contains(p1.AddedDate)
select (p1.Price / p1.Amount);
decimal lowestPrice = query.Min();
decimal highestPrice = query.Max();
不知道是否可以更短或更高效地完成?
可在此处找到演示:https ://dotnetfiddle.net/MRJzHs
推荐阅读
- verilog - Systemverilog Vivado 中的增量操作未按预期工作
- android - 为什么 android studio 组装我们的 dyanimc 功能模块测试 apk?
- firebase - Firestore 中的嵌套对象具有不一致的字段名称
- node.js - nodejs问题将graphql上传文件发送到服务
- elasticsearch - 如何深拷贝elasticsearch QueryBuilder?
- html - CSS Flex 行方向与 50% 列拉伸
- string - 如何在 Rust 中匹配字符串和字符串?
- android - Webview第二次尝试不加载资产文件
- powershell - 使用 -ErrorAction STOP 时,Remove-CalendarEvents 失败
- scripting - 进行数值微分时避免除以零