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

Sql 根据某些列(而不是所有列)选择不同的行,sql,linq-to-sql,frameworks,entity,Sql,Linq To Sql,Frameworks,Entity,我最初在处理从分组结果中选择某些聚合值(最小值、最大值等)的SQL查询时遇到了这个问题。例如,从每个水果组中选择最便宜的水果、品种和价格。常见的解决方案是首先使用MIN将水果与最便宜的价格一起分组,然后自行加入它以获得另一列(在本例中为“品种”) 现在,假设我们有多个品种的水果具有相同的价格,而该价格恰好是最低价格。因此,我们最终得到如下结果: Apple Fuji 5.00 Apple Green 5.00 Orange valencia

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

现在,假设我们有多个品种的水果具有相同的价格,而该价格恰好是最低价格。因此,我们最终得到如下结果:

Apple    Fuji         5.00
Apple    Green        5.00
Orange   valencia     3.00
Pear     bradford     6.00
我怎样才能使最终结果中只出现一种苹果呢?它可以是任何一个品种,无论是第一个、最后一个还是随机出现的记录

所以基本上我需要根据三列中的两列相等来消除行,并且只要最终结果集中还有一行,消除哪一行并不重要


任何帮助都将不胜感激。

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

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


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

试试这个。。。我加了更多的水果。阅读它的方法是从最里面的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

可以粘贴原始查询吗?Min本身会将每个组限制为一行,但当连接回原始表以获得另一列(在id=id和price=price上)时,它将生成两行,因为有两个品种的Min price相同。所以我的问题是如何防止这种情况发生。