Выберите отдельные строки на основе некоторых, но не всех столбцов - PullRequest
1 голос
/ 30 марта 2011

Первоначально я столкнулся с этой проблемой, работая над SQL-запросами, которые выбирают определенные совокупные значения (минимальные, максимальные и т. Д.) Из сгруппированных результатов.Например, выберите самый дешевый фрукт, его сорт и цену для каждой фруктовой группы.Обычное решение - сначала сгруппировать фрукты вместе с самой дешевой ценой, используя MIN, а затем самостоятельно объединить их, чтобы получить другой столбец (в данном случае «сорт»).

Теперь скажите, если у нас более одного сортафрукты с той же ценой, и эта цена оказалась самой низкой ценой.Таким образом, мы получаем такие результаты:

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

Как мне сделать так, чтобы в конечном результате отображался только один вид яблок?Это может быть любая из разновидностей, будь то запись, которая показывает первую, последнюю или случайную запись.

Так что в основном мне нужно исключить строки, основанные на равенстве двух из трех столбцов, и это не 'Не имеет значения, какие строки удаляются, если в окончательном наборе результатов осталась одна.

Любая помощь приветствуется.

Ответы [ 3 ]

3 голосов
/ 30 марта 2011

Попробуй это ... Я добавил больше фруктов. Способ прочитать это - начать с самого внутреннего предложения 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 голосов
/ 30 марта 2011

Один из вариантов - ранжировать строки на основе некоторых критериев (в алфавитном порядке сортов фруктов), а затем выбрать минимум ранга.

В ms-sql есть функция rank () для именно этогоцель.

0 голосов
/ 30 марта 2011

Вы можете использовать оператор MIN, который ограничит его до первой строки

...