首页 > 解决方案 > 根据给定数量和价格的最新日期查找产品的最低和最高单价(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

标签: c#entity-framework

解决方案


所以一种方法是

        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


推荐阅读