SQL - 每组只有一个结果

时间:2014-09-29 08:47:44

标签: sql sql-server-2012

我有一个SQL问题(MS SQL Server 2012),我只想要每个结果一个结果,但在某些行中有不同的项目,因此group by不起作用。

以下是声明:

Select Deliverer, ItemNumber, min(Price)
From MyTable
Group By Deliverer, ItemNumber

所以我希望一个项目的价格最低的送货员。 通过此查询,我得到每个送货员的最低价格。

结果如:

DelA    12345    1,25
DelB    11111    2,31

并不喜欢

DelA    12345    1,25
DelB    12345    1,35
DelB    11111    2,31
DelC    11111    2,35

我知道这可能是一个简单的解决方案的愚蠢问题,但我现在尝试了大约三个小时,却找不到解决方案。有人说,我对SQL不是很有经验。

2 个答案:

答案 0 :(得分:2)

只需在适当的时候(最小或最大)将聚合函数添加到您的deliveryrer字段。根据您的数据,我猜你需要min(deliveryrer),因此使用下面的查询来获得你想要的结果。

Select mIN(Deliverer), ItemNumber, min(Price)
From MyTable
Group By  ItemNumber;

编辑:

以下查询应该可以帮助您以最低的价格获得送货员:

SELECT TABA.ITEMNUMBER, TABA.MINPRICE, TABB.DELIVERER
FROM
  ( 
      SELECT ITEMNUMBER, MIN(PRICE) MINPRICE 
      FROM MYTABLE GROUP BY
      ITEMNUMBER
   ) TABA JOIN
   MYTABLE TABB
   ON TABA.ITEMNUMBER=TABB.ITEMNUMBER AND 
      TABA.MINPRICE = TABB.PRICE

答案 1 :(得分:0)

您应该可以使用RANK()(或DENSE_RANK())函数以及一些分区执行此操作,例如:

; With rankings as (
    SELECT      Deliverer,
                rankings.ItemNumber, 
                rankings.Price
                RANK() OVER (PARTITION BY ItemNumber ORDER BY Price ASC) AS Ranking

    FROM        MyTable (Deliverer, ItemNumber, Price)
)
SELECT      rankings.Deliverer, 
            rankings.ItemNumber, 
            rankings.Price

FROM        rankings

WHERE       ranking = 1