首页  >  问答  >  正文

使用last_value()时结果不正确

这是表格:

id 地区 品种 价格
1 亚历山大谷 赤霞珠 35
2 亚历山大谷 赤霞珠 45
3 亚历山大谷 梅洛 19
4 加利福尼亚州 长相思 8
5 加利福尼亚州 黑皮诺 17

我想找出每个地区最便宜和最昂贵的品种,因此输出应该是:

地区 便宜
亚历山大谷 赤霞珠 梅洛
加利福尼亚州 黑皮诺 长相思

我能够使用两个 first_value() 获得正确的结果

SELECT
  DISTINCT region,
  FIRST_VALUE(variety) OVER (PARTITION BY region ORDER BY price DESC) AS expensive,
  FIRST_VALUE(variety) OVER (PARTITION BY region ORDER BY price) AS cheapest
FROM wine_list

我认为它相当于以下查询

SELECT
  DISTINCT region,
  FIRST_VALUE(variety) OVER (PARTITION BY region ORDER BY price DESC) AS expensive,
  LAST_VALUE(variety) OVER (PARTITION BY region ORDER BY price DESC) AS cheapest
FROM wine_list

但是现在我的输出是:

地区 便宜
亚历山大谷 赤霞珠 赤霞珠
亚历山大谷 赤霞珠 梅洛
加利福尼亚州 黑皮诺 黑皮诺
加利福尼亚州 黑皮诺 长相思

为什么我的输出是错误的?我很困惑。

P粉486743671P粉486743671187 天前360

全部回复(1)我来回复

  • P粉253800312

    P粉2538003122024-04-01 09:18:04

    FIRST_VALUELAST_VALUE 的默认窗口是 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW。 IE。这是第一个响应。最后一个值“到目前为止”。

    但是,您希望它适用于整个数据集,因此您必须明确描述窗口范围:

    SELECT DISTINCT
      region,
      FIRST_VALUE(variety) OVER 
        (PARTITION BY region ORDER BY price DESC
         ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS expensive,
      LAST_VALUE(variety) OVER 
         (PARTITION BY region ORDER BY price DESC
          ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS cheapest
    FROM wine_list;

    回复
    0
  • 取消回复