2011-03-30 92 views
1

我最初在處理SQL查詢時遇到了這個問題,這些查詢從分組結果中選擇某些聚合值(最小值,最大值等)。例如,選擇每個水果組的最便宜的水果,品種和價格。常見的解決方案是先用MIN分組水果和最便宜的價格,然後自己加入以獲得另一列(本例中爲「多樣性」)。根據某些列而不是所有列選擇不同的行

現在說,如果我們有多個品種的水果價格相同,價格恰巧是最低的價格。因此,我們最終得到的結果是這樣的:

Apple Fuji   5.00 
Apple Green  5.00 
Orange valencia  3.00 
Pear  bradford  6.00 

如何讓這個只有一個種類的蘋果都在最終結果中顯示出來?它可以是任何一個品種,無論是顯示第一個,最後一個還是隨機的記錄。

所以基本上我需要根據三列中的兩列消除行,並且只要最後一個結果集中剩下一行,哪些行就會被排除並不重要。

任何幫助,將不勝感激。

+0

您可以粘貼您的原始查詢。 – Slappy 2011-03-30 03:53:00

回答

0

你可以使用一個極小算,這將限制它的第一行

+0

Min本身會將每個組限制爲一行,但是當返回到原始表以獲取另一列(id = id和price = price)時,它將生成兩行,因爲有兩個具有相同最小价格的品種。所以我的問題是如何防止這種情況發生。 – user683202 2011-03-30 04:26:28

+0

然後你想要一個RowNumber答案。 Christian的長相很好 – Slappy 2011-03-30 05:27:16

0

一種選擇是排名(水果品種按字母順序排列)基於一些標準的行,然後挑最低等級的。

在ms-sql中有一個rank()函數用於此目的。

3

試試這個......我添加了更多的水果。閱讀它的方法是從最內層的From子句開始,並按照你的方式工作。

create table fruit (
     FruitName varchar(50) not null, 
     FruitVariety varchar(50) not null, 
     Price decimal(10,2) not null 
    ) 

    insert into fruit (FruitName, FruitVariety, Price) 
    values ('Apple','Fuji',5.00) 
    insert into fruit (FruitName, FruitVariety, Price) 
    values ('Apple','Green',5.00) 
    insert into fruit (FruitName, FruitVariety, Price) 
    values ('Orange','Valencia',3.00) 
    insert into fruit (FruitName, FruitVariety, Price) 
    values ('Orange','Navel',5.00) 
    insert into fruit (FruitName, FruitVariety, Price) 
    values ('Pear','Bradford',6.00) 
    insert into fruit (FruitName, FruitVariety, Price) 
    values ('Pear','Nashi',8.00) 

    select 
     rankedCheapFruits.FruitName, 
     rankedCheapFruits.FruitVariety, 
     rankedCheapFruits.Price 
    from (
     select 
      f.FruitName, 
      f.FruitVariety, 
      f.Price, 
      row_number() over(
       partition by f.FruitName 
       order by f.FruitName, f.FruitVariety 
       ) as FruitRank 
     from (
      select 
       f.FruitName, 
       min(f.Price) as LowestPrice 
      from Fruit f 
      group by 
       f.FruitName 
      ) as cheapFruits 
      join Fruit f on cheapFruits.FruitName = f.FruitName 
       and f.Price = cheapFruits.LowestPrice 
     ) rankedCheapFruits 
    where rankedCheapFruits.FruitRank = 1 
+0

+1額外水果:) – Slappy 2011-03-30 05:28:06

相關問題