【问题标题】:Determine Current price of each product确定每种产品的当前价格
【发布时间】:2021-12-29 00:01:18
【问题描述】:

我想弄清楚如何确定产品的最新价格。我正在苦苦挣扎,因为价格没有更新,而且日期没有达到正确的数字。 这是我尝试编写的代码(我知道这不是最好的):

SELECT p.prodID, pr.price, MAX(pr.[from]) [date] 
    FROM Price pr
    INNER JOIN Product p ON p.prodId = pr.prodId
    GROUP BY p.prodID, pr.price;

由于这个问题,我有一个显示多个不同日期价格的数据库,但我正在尝试查找最近的数据,例如数据:

INSERT INTO Price VALUES
(36, '20191221', 16.47)
INSERT INTO Price VALUES
(36, '20191226', 16.47)
INSERT INTO Price VALUES
(36, '20191229', 12.81)
INSERT INTO Price VALUES
(36, '20191230', 12.81)

这也是价格表:

Create Table Price (
        prodId int Foreign Key References Product(prodId),
        [from] date,
        price decimal(10,2),
        Constraint PK_Price Primary Key (prodId, [from])
    );

为简单起见,我只关注产品 36,但有许多不同的产品。当前结果显示价格为 18.30,日期为 2019-10-12 我希望结果显示价格为 12.81,日期为 2019-12-30。

【问题讨论】:

  • 您提供的示例数据无法产生您声称的输出,因为这些值不存在于数据中。样本数据中没有18.302019-10-12。你也应该解决这个问题,并显示你得到的实际输出。
  • 啊好吧!这是因为实际数据有很多很多行代码,我会改变它来显示它
  • 这能回答你的问题吗? Get top 1 row of each group
  • 我建议你对这个目标有不同的看法。通常,活跃的 OLTP 系统需要经常知道“当前”价格。通常所有的旧价格除了不经常的管理或历史报告之外没有任何用处。在这种情况下,故意重复可能会有所帮助 - 将当前价格与您当前的 表分开存储。

标签: sql sql-server database date


【解决方案1】:

您可以使用row_number() 窗口函数为每个产品按日期订购的价格分配一个编号。

SELECT x.[prodid],
       x.[from],
       x.[price]
       FROM (SELECT p.[prodid],
                    p.[from],
                    p.[price],
                    row_number() OVER (PARTITION BY p.[prodid]
                                       ORDER BY p.[from] DESC) [rn]
                    FROM price p) x
       WHERE x.[rn] = 1;

【讨论】:

    猜你喜欢
    • 2020-03-05
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 2016-05-09
    • 2015-11-05
    相关资源
    最近更新 更多