Как вы возвращаете 1 значение в строке максимум нескольких столбцов:
TableName
[Number, Date1, Date2, Date3, Cost]
Мне нужно вернуть что-то вроде этого:
[Number, Most_Recent_Date, Cost]
Запрос?
sql
sql-server
tsql
BenB
источник
источник
WHEN Date1 > Date2 AND Date1 > Date3 THEN Date1; WHEN Date2 > Date3 THEN Date3; ELSE Date3
?Вот еще одно приятное решение для
Max
функциональности с использованием T-SQL и SQL Serverисточник
Если вы используете MySQL, вы можете использовать
источник
Есть еще 3 метода, где
UNPIVOT
(1) является самым быстрым на сегодняшний день, за которым следует Simulated Unpivot (3), который намного медленнее, чем (1), но все же быстрее, чем (2)Решение 1 (
UNPIVOT
)Решение 2 (подзапрос на строку)
Решение 3 (Имитация
UNPIVOT
)источник
Любой из двух примеров ниже будет работать:
Второе дополнение к ответу Лассевка .
источник
Для T-SQL (MSSQL 2008+)
источник
источник
Скалярная функция вызывает всевозможные проблемы с производительностью, поэтому лучше, если возможно, обернуть логику во встроенную табличную функцию. Это функция, которую я использовал для замены некоторых пользовательских функций, которые выбирали минимальные / максимальные даты из списка до десяти дат. При тестировании на моем наборе данных из 1 миллиона строк скалярной функции потребовалось более 15 минут, прежде чем я завершил запрос, и для встроенного TVF потребовалась 1 минута, то есть столько же времени, сколько для выбора набора результатов во временной таблице. Чтобы использовать это, вызовите функцию из подзапроса в SELECT или CROSS APPLY.
источник
Это немного легче записать и пропускает этапы оценки, поскольку оператор case оценивается по порядку.
источник
К сожалению , ответ Лассе , хотя и кажется очевидным, имеет решающий недостаток. Он не может обрабатывать значения NULL. Любое единственное значение NULL приводит к возвращению Date1. К сожалению, любая попытка решить эту проблему имеет тенденцию быть чрезвычайно грязной и не очень хорошо масштабируется до 4 или более значений.
первый ответ databyss выглядел (и есть) хорошо. Однако было неясно, будет ли ответ легко экстраполироваться на 3 значения из объединения нескольких таблиц вместо более простых 3 значений из одной таблицы. Я хотел избежать превращения такого запроса в подзапрос, чтобы получить максимум 3 столбца, а также был уверен, что отличную идею databyss можно немного очистить.
Итак, без дальнейших церемоний, вот мое решение (полученное из идеи Databyss).
Он использует перекрестные объединения, выбирая константы для имитации эффекта объединения нескольких таблиц. Важно отметить, что все необходимые псевдонимы проходят правильно (что не всегда так), и это делает шаблон довольно простым и достаточно масштабируемым с помощью дополнительных столбцов.
источник
Проблема: выберите минимальное значение ставки, присвоенное организации. Требования: Агентские ставки могут быть нулевыми.
Вдохновленный этим ответом от Nat
источник
Если вы используете SQL Server 2005, вы можете использовать функцию UNPIVOT. Вот полный пример:
источник
Использование CROSS APPLY (для 2005+) ....
источник
С SQL Server 2012 мы можем использовать IIF .
источник
DECLARE @Date1 DATE='2014-08-01'; DECLARE @Date2 DATE=null; DECLARE @Date3 DATE='2014-07-05'; /*this gets returned*/
select IIF(@Date1 > @Date2 or @Date2 is null, IIF(@Date1 > @Date3 or @Date3 is null, @Date1, @Date3), IIF(@Date2 > @Date3 or @Date3 is null, @Date2, @Date3)) as MostRecentDate
Пожалуйста, попробуйте использовать
UNPIVOT
:источник
Я предпочитаю решения, основанные на случае, когда, я предполагаю, что это должно оказать наименьшее влияние на возможное падение производительности по сравнению с другими возможными решениями, такими как с перекрестным применением, values (), пользовательскими функциями и т. Д.
Вот вариант case-when, который обрабатывает нулевые значения с большинством возможных тестовых случаев:
и результат:
источник
Вы можете создать функцию, в которой вы передадите даты, а затем добавите функцию в оператор выбора, как показано ниже. выберите Число, dbo.fxMost_Recent_Date (Дата1, Дата2, Дата3), Стоимость
(@ Date1 smalldatetime, @ Date2 smalldatetime, @ Date3 smalldatetime) ВОЗВРАЩАЕТ smalldatetime, КАК НАЧИНАЕТСЯ @Result smalldatetime
КОНЕЦ
источник
На основе решения ScottPletcher от http://www.experts-exchange.com/Microsoft/Development/MS-SQL-Server/Q_24204894.html я создал набор функций (например, GetMaxOfDates3, GetMaxOfDates13), чтобы найти максимум до 13 значений даты с помощью UNION ALL. См. Функцию T-SQL, чтобы получить максимум значений из одной строки. Однако на момент написания этих функций я не рассматривал решение UNPIVOT.
источник
Еще один способ использования CASE WHEN
источник
Выше таблицы приведена таблица окладов сотрудников с столбцами salary1, salary2, salary3, salary4. В приведенном ниже запросе будет возвращено максимальное значение из четырех столбцов.
Выполнение вышеуказанного запроса даст вывод как large_val (10001)
Логика вышеуказанного запроса выглядит следующим образом:
выходной будет 10001
источник
вот хорошее решение:
источник
Я не знаю, работает ли он на SQL и т. Д. В справке M $ ACCESS есть функция,
MAXA(Value1;Value2;...)
которая должна делать это.Надежда может помочь кому-то.
PD: значения могут быть столбцами или рассчитанными и т. Д.
источник
MAXA
это функция Excel , а не Access.