使用GROUP BY / MAX获取相邻字段

时间:2014-05-15 12:58:01

标签: sql tsql

这可能已被多次询问,但我找不到解决方案,因为我不知道如何用这句话来表达。

[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

此查询已经是子查询的一部分,因此我希望获得最佳性能解决方案。

2 个答案:

答案 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

只需将“表格”替换为您的表格名称。