这可能已被多次询问,但我找不到解决方案,因为我不知道如何用这句话来表达。
[product] [shop] [price] [date]
Pizza Shop1 10 2014-05-10
Pizza Shop2 12 2014-05-04
Snow Shop1 101 2014-05-02
Snow Shop3 93 2014-05-11
我希望查询此表并获取上次添加产品的价格:
[product] [shop] [price] [date]
Pizza Shop1 10 2014-05-10
Snow Shop3 93 2014-05-11
明显错误的语法:
SELECT
product,
shop WHERE MAX(date),
price WHERE MAX(date),
MAX(date)
FROM myTable
GROUP BY product
此查询已经是子查询的一部分,因此我希望获得最佳性能解决方案。
答案 0 :(得分:1)
使用ROW_NUMBER()
,您可以将记录拆分为每个产品的分区,并为每个产品分配一个行号,从1开始,作为分区(产品)的最新记录。
然后,您只需为每个产品选择行号为1的所有记录。
WITH
sequenced AS
(
SELECT
myTable.*,
ROW_NUMBER() OVER (PARTITION BY [product] ORDER BY [date] DESC) AS product_date_ordinal
FROM
myTable
)
SELECT
*
FROM
sequenced
WHERE
product_date_ordinal = 1
这假定SQL SERVER 2005以后,您应该在product, date DESC
上有一个索引以获得最佳性能。
答案 1 :(得分:0)
你可以试试这个。使用子查询连接来过滤你的表,不如我想的第一个答案好,但更容易阅读和理解:
SELECT Table.*
FROM Table
RIGHT JOIN
(
SELECT product, max(date) AS date FROM Table
GROUP BY product
) AS Filter
ON Filter.product = Table.product AND Filter.date = Table.date
只需将“表格”替换为您的表格名称。