【问题标题】:Getting latest price of different products from control table从控制表中获取不同产品的最新价格
【发布时间】:2021-01-08 15:32:57
【问题描述】:

我有一个控制表,其中项目编号的价格是按日期跟踪的。

id  ItemNo  Price  Date
---------------------------
1   a001    100    1/1/2003
2   a001    105    1/2/2003
3   a001    110    1/3/2003
4   b100    50     1/1/2003
5   b100    55     1/2/2003
6   b100    60     1/3/2003
7   c501    35     1/1/2003
8   c501    38     1/2/2003
9   c501    42     1/3/2003
10  a001    95     1/1/2004

这是我正在运行的查询。

SELECT  pr.*
FROM    prices pr
        INNER JOIN
        (
            SELECT  ItemNo, max(date) max_date
            FROM     prices
            GROUP   BY ItemNo
        ) p ON  pr.ItemNo = p.ItemNo AND
                pr.date = p.max_date
                order by ItemNo ASC

我的值低于值

id  ItemNo   Price  Date
------------------------------
10  a001     95     2004-01-01
6   b100     60     2003-01-03
9   c501     42     2003-01-03

问题是,我的查询是对还是错?虽然我得到了我想要的结果。

【问题讨论】:

    标签: sql sql-server datetime greatest-n-per-group window-functions


    【解决方案1】:

    您的查询可以满足您的需求,并且是解决您的问题的有效方法。

    另一种选择是使用相关子查询进行过滤:

    select p.*
    from prices p 
    where p.date = (select max(p1.date) from prices where p1.itemno = p.itemno)
    

    这个查询的好处是它可以利用(itemno, date)上的索引。

    你也可以使用窗口函数:

    select *
    from (
        select p.*, rank() over(partition by itemno order by date desc) rn
        from prices p
    ) p
    where rn = 1
    

    我建议根据您的真实数据对这三个选项进行基准测试,以评估哪一个表现更好。

    【讨论】:

    • thanx,我将在我的程序中尝试所有三个以查看结果。
    猜你喜欢
    • 2015-11-05
    • 2015-04-22
    • 2019-02-28
    • 2020-10-16
    • 1970-01-01
    • 2019-10-29
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    相关资源
    最近更新 更多