【问题标题】:Possible sybase sql query可能的sybase sql查询
【发布时间】:2013-04-18 10:23:37
【问题描述】:

多年后我正在尝试重新使用 sql。我也是 Sybase 的新手。您能否就以下问题提出一个可能的查询?

有一个表叫蔬菜如下。

| product | price | date     |
| beans   | 1.78  | 20040903 |
| beans   | 1.79  | 20040902 |
| potato  | 1.78  | 20040902 |

我需要获取每种蔬菜的最新可用价格。预期的数据库是 sybase。非常感谢。

【问题讨论】:

    标签: sql sybase


    【解决方案1】:

    您可以使用子查询为每个 product 获取 max(date),然后重新加入您的表:

    select v1.product, 
      v1.price,
      v1.date
    from vegetables v1
    inner join
    (
      select product, max(date) MaxDate
      from vegetables
      group by product
    ) v2
      on v1.product = v2.product
      and v1.date = v2.maxdate;
    

    SQL Fiddle with Demo(演示是SQL Server,但语法应该是有效的)。

    如果您的 Sybase 版本支持窗口函数,那么您可以使用以下内容:

    select product, price, date
    from 
    (
      select product, price, date,
        row_number() over(partition by product order by date desc) rn
      from vegetables
    ) v
    where rn = 1;
    

    SQL Fiddle with Demo

    【讨论】:

    • select product, max(date) MaxDate from vegetables group by product --为什么我们不能使用这个查询? SQL Fiddle
    • 因为他们希望 price 与最大日期相关联,如果您添加,您也必须按它进行分组,并且值是不同的。
    • @bluefeet 很好的答案。以及 sql fiddle 的重要提示(不知道那个)。我在概念上考虑进行此类操作,但不确定语法。现在我看到它是有道理的。 “分区上的行号”语法对我来说是新的。将不得不查找。非常感谢。
    • @junkie 欢迎您,我认为并非所有版本的 Sybase 都支持 row_number,因此您必须检查您的版本。 :)
    【解决方案2】:

    据我了解,标准 SQL 查询在大多数情况下应该可以在 Sybase 数据库上运行。我不是数据库管理员,但这样的事情可能会起作用:

    SELECT * FROM 
      vegetables v 
    INNER JOIN 
      (SELECT 
          iv.id, 
          MAX(iv.date) AS date
        FROM 
          vegetables iv 
        GROUP BY 
          iv.id
      ) maxv ON maxv.date = v.date
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-29
      • 1970-01-01
      • 2011-12-26
      • 2014-03-21
      • 2021-07-09
      • 2014-01-31
      相关资源
      最近更新 更多