MIN MAX с использованием оператора CASE на SQL сервере - PullRequest
0 голосов
/ 09 февраля 2020

enter image description here

У меня есть такая таблица. Все, что я хочу, в названии страны, численности населения и, если население в MAX, то обозначьте MAX и аналогично для MIN. Я написал ниже запрос в SQL Сервер, используя оператор CASE.

/* MIN/MAX Population amongst the countries */
SELECT 
    country, population,
    CASE
        WHEN population == MIN(population) THEN "MIN"
        WHEN population == MAX(population) THEN "MAX" ELSE "NA"
    END as "pop_stats"
FROM
    countries_by_population;

Ответы [ 3 ]

2 голосов
/ 09 февраля 2020

Демонстрация на db <> fiddle

Во-первых, Вы должны хранить @Min_Population и @Max_Population, получив как ниже

DECLARE @Min_Population decimal(18,2), @Max_Population decimal(18,2)
SELECT @Min_Population = MIN(population), @Max_Population = MAX(population)
FROM countries_by_population

После этого вы можете сравнить значение для каждого элемента, например (обратите внимание, что символ в SQL закрывается в одинарных кавычках вместо двойных)

CASE
    WHEN population = @Min_Population THEN 'MIN'
    WHEN population = @Max_Population THEN 'MAX' ELSE 'NA'
END as pop_stats

Полный запрос

DECLARE @Min_Population decimal(18,2), @Max_Population decimal(18,2)
SELECT @Min_Population = MIN(population), @Max_Population = MAX(population)
FROM countries_by_population

SELECT country, population,
    CASE
        WHEN population = @Min_Population THEN 'MIN'
        WHEN population = @Max_Population THEN 'MAX' ELSE 'NA'
    END as pop_stats
FROM countries_by_population;
0 голосов
/ 09 февраля 2020

Вы можете использовать функцию анализа окна c, такую ​​как DENSE_RANK(), включая предложение ORDER BY population в descending и ascending (по умолчанию), для определения значений MIN и MAX путем возврата значений в виде 1 из них, соответственно, для возможности использования в операторе CASE (DENSE_RANK() функция возвращает более одной строки, удовлетворяющей связанным условиям в ties встречающихся случаях среди значений экстремума )

SELECT country, population,
       CASE
         WHEN DENSE_RANK() OVER ( ORDER BY population ) = 1 THEN 'MIN'
         WHEN DENSE_RANK() OVER ( ORDER BY population DESC ) = 1 THEN 'MAX' ELSE 'NA'
       END AS "pop_stats"
  FROM countries_by_population
 ORDER BY population DESC

Кстати, не используйте двойные кавычки для производных значений столбцов, но используйте одинарные кавычки.

Демо

0 голосов
/ 09 февраля 2020

Используйте over(), чтобы сделать ее оконной функцией без разделения:

SELECT country, population,
    CASE
        WHEN population = MIN(population) over() THEN 'MIN'
        WHEN population = MAX(population) over() THEN 'MAX' 
        ELSE 'NA'
    END as pop_stats
FROM countries_by_population;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...