Sql 从控制表中获取不同产品的最新价格

Sql 从控制表中获取不同产品的最新价格,sql,sql-server,datetime,greatest-n-per-group,window-functions,Sql,Sql Server,Datetime,Greatest N Per Group,Window Functions,我有一个控制表,其中带有项目编号的价格按日期进行跟踪 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

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

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

问题是,我的疑问是对的还是错的?尽管我得到了我想要的结果。

您的查询符合您的要求,是解决问题的有效方法

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

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,我将在我的程序中尝试这三个选项,以查看结果。