根据某些列而不是所有列选择不同的行

时间:2011-03-30 03:38:44

标签: sql linq-to-sql frameworks entity

我最初在处理SQL查询时遇到了这个问题,这些查询从分组结果中选择某些聚合值(最小值,最大值等)。例如,从每个水果组中选择最便宜的水果,其品种和价格。常见的解决方案是首先使用MIN将水果和最便宜的价格分组,然后自己加入以获得另一列(在这种情况下为“变种”)。

现在说如果我们有多种水果价格相同,那个价格恰好是最低价。所以我们最终得到这样的结果:

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

如何制作,以便在最终结果中只出现一种苹果?它可以是任何一个品种,无论是显示第一个,最后一个还是随机的记录。

所以基本上我需要根据三列中的两列相等来消除行,只要在最终结果集中还有一行就消除了哪些行无关紧要。

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您可以使用MIN运算符,将其限制为第一行

答案 2 :(得分:0)

一种选择是根据某些标准(水果品种的字母顺序)对行进行排名,然后选择最低排名。

ms-sql中有一个rank()函数用于此目的。