【问题标题】:How do I use window function to get max price and its id?如何使用窗口函数获取最高价格及其 id?
【发布时间】:2015-09-19 05:46:38
【问题描述】:

我有这个问题

select adate, factoryid, purchid, itemname, max(price) as price 
from tableb where catnum = 9
group by adate, factoryid, purchid, itemname
order by adate, factoryid, purchid, itemname

但我想要该行的 id。所以在一个完美的世界里:

select id, adate, factoryid, purchid, itemname, max(price) as price 
from tableb where catnum = 9
group by adate, factoryid, purchid, itemname
order by adate, factoryid, purchid, itemname

但我知道那行不通。

所以我尝试了这个:

select id, adate, factoryid, purchid, itemname, 
       max(price) over(partition by adate, factoryid, purchid, itemname) as price 
from tableb where catnum = 9

这行不通。所有 id 的价格都是重复的。查询结果集从 4000 行增加到 11000 行。

很明显,我弄错了窗口函数。首先,我做错了什么,其次,当然,我该如何解决?

【问题讨论】:

  • id 不是唯一确定的。你想要所有的 id 还是任何一个?

标签: sql tsql sql-server-2012 aggregate-functions window-functions


【解决方案1】:
SELECT  *
FROM    (
        SELECT  *,
                ROW_NUMBER() OVER (PARTITION BY adate, factoryid, purchid, itemname ORDER BY price DESC, id DESC) rn
        FROM    tableb 
        WHERE   catnum = 9
        ) q
WHERE   rn = 1

【讨论】:

    【解决方案2】:

    您可以使用 MAXFIRST_VALUE 的窗口版本,可从 SQL Server 2012+ 获得:

    SELECT DISTINCT adate, factoryid, purchid, itemname, 
           MAX(price) OVER (PARTITION BY adate, factoryid, purchid, itemname) AS price,
           FIRST_VALUE(id) OVER (PARTITION BY adate, factoryid, purchid, itemname
                                 ORDER BY price DESC) AS id
    FROM tableb 
    WHERE catnum = 9
    ORDER BY adate, factoryid, purchid, itemname
    

    【讨论】:

      【解决方案3】:

      我不清楚你为什么想要这个 id 但是...... 假设

      1. 您想要条件的所有 ID
      2. id 是 tableb 的 PK

      那么这可能会起作用:

      SELECT tableb.* FROM tableb
      INNER JOIN
      (
      select adate, factoryid, purchid, itemname, max(price) as price 
      from tableb where catnum = 9
      group by adate, factoryid, purchid, itemname
      ) AS grouped
      ON  tableb.adate = grouped.adate AND
          tableb.factoryid = grouped.factoryid AND
          tableb.purchid = grouped.purchid AND
          tableb.itemname = grouped.itemname AND
          tableb.price = grouped.price
      order by tableb.adate, tableb.factoryid, tableb.purchid, tableb.itemname
      

      【讨论】:

        猜你喜欢
        • 2016-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-25
        • 1970-01-01
        • 2021-06-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多