Я использую Postgresql версии 9.1.9:
select version();
"PostgreSQL 9.1.9 on armv7l-unknown-linux-gnueabihf,
compiled by gcc (Debian 4.6.3-14+rpi1) 4.6.3, 32-bit"
и у меня есть простая таблица (называемая Test), в которой есть один столбец bigint
с нулевым значением (называемый A). В таблице есть следующие данные:
NULL
1
2
Теперь я хочу создать плотное ранжирование (поэтому использую dense_rank()), поэтому я делаю следующий запрос:
select "A", dense_rank() over (order by "A" desc) from public."Test"
Это возвращает:
NULL,1
2,2
1,3
Интересно, если я настрою то же самое в SQL Server 2008 R2 и запущу тот же запрос, который он вернет:
2,1
1,2
NULL,3
Итак, меня интересует, кто прав, но на практике я хочу, чтобы SQL Server вел себя так, как я могу заставить PostgreSQL рассматривать значение null как последнее в рейтинге?
(т.е. сортировать NULLS как меньше любого значения)
Я заметил это на странице плотности_ранка, но там не говорится конкретно об этой функции, но, возможно, это подсказка?
Примечание. Стандарт SQL определяет параметр УВАЖАТЬ NULLS или ИГНОРИРОВАТЬ NULLS для опережения, отставания, первого_значения, последнего_значения и n-го_значения. Это не реализовано в PostgreSQL: поведение всегда такое же, как и стандартное по умолчанию, а именно УВАЖЕНИЕ NULL. Аналогичным образом стандартная опция FROM FIRST или FROM LAST для nth_value не реализована: поддерживается только поведение по умолчанию FROM FIRST. (Вы можете получить результат FROM LAST, изменив порядок ORDER BY.)