Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何使用窗口函数获取最大价格及其id?_Sql_Tsql_Sql Server 2012_Aggregate Functions_Window Functions - Fatal编程技术网

Sql 如何使用窗口函数获取最大价格及其id?

Sql 如何使用窗口函数获取最大价格及其id?,sql,tsql,sql-server-2012,aggregate-functions,window-functions,Sql,Tsql,Sql Server 2012,Aggregate Functions,Window Functions,我有这个疑问 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 但我要那排的身份证。所以在一个完美的世界里: select id, adate, factoryid, purchi

我有这个疑问

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
但我要那排的身份证。所以在一个完美的世界里:

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,但是。。。
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
假定

  • 您需要该条件的所有ID
  • id是表B的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
    

    您可以使用Windows版本的
    MAX
    以及,可从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
    

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