Такое ощущение, что это должно быть легко. Как я могу получить последние даты, которые находятся в разных столбцах
DROP TABLE #indebtedness
CREATE TABLE #indebtedness (call_case CHAR(10), date1 DATETIME, date2 DATETIME, date3 DATETIME)
INSERT #indebtedness VALUES ('Key1', '2019-10-30', '2019-11-30', '2019-10-25')
INSERT #indebtedness VALUES ('Key2', '2019-10-20', '2019-10-30', '2019-10-15')
INSERT #indebtedness VALUES ('Key3', '2019-11-11', '2019-10-29', '2019-10-30')
INSERT #indebtedness VALUES ('Key4', null , '2019-10-29', '2019-10-13')
select call_case, ?? AS 'Latest Date' from #indebtedness
Я хотел бы, чтобы результат был:
call_case Latest Date
Key1 2019-11-30
Key2 2019-10-30
Key3 2019-11-11
Key4 2019-10-29
sql
sql-server
datetime
Ахмед Алхтеб
источник
источник
NULL
.MAX
использованиеGROUP BY
. Поэтому мой ответ на ваш вопрос «не исправит», потому что я думаю, что, возможно, ваш дизайн базы данных должен измениться.call_case
) и отметка времени. Ни одна таблица с 50 столбцамиВ настоящее время принятый ответ - лучший ответ, но я не думаю, что он достаточно хорошо объясняет почему. Другие ответы, безусловно, выглядят намного чище (кто хочет написать это безобразное утверждение), но, вероятно, будут намного хуже, когда вы начнете работать в масштабе.
Вот как я все настроил
В моей системе это дает мне 12 872 738 строк в таблице. Если я попытаюсь
SELECT INTO
выполнить каждый из указанных выше запросов (настроенный таким образом, чтобы мне не нужно было ждать, пока он завершит печать результатов в SSMS), я получу следующие результаты:Если вы посмотрите на планы запросов, станет совершенно очевидно, почему - добавив любой тип разворота или агрегата (или, боже упаси
STRING_SPLIT
), вы получите все виды дополнительных операторов, которые вам не нужны (и это заставляет план идти параллельно, забирая ресурсы, которые могут понадобиться другим запросам). По контрактуCASE
основанное решение не идет параллельно, работает очень быстро и невероятно просто.В этом случае, если у вас нет неограниченных ресурсов (у вас их нет), вы должны выбрать самый простой и быстрый подход.
Возник вопрос, что делать, если вам нужно продолжать добавлять новые столбцы и расширять оператор case. Да, это становится громоздким, как и любое другое решение. Если это действительно правдоподобный рабочий процесс, то вам следует переделать таблицу. То, что вы хотите, вероятно, выглядит примерно так:
Это, безусловно, не освобождает от потенциальных проблем с производительностью и потребует тщательной настройки индекса, но является лучшим способом обработки произвольного числа потенциальных временных меток.
В случае, если какие-либо ответы будут удалены, вот версии, которые я сравнивал (по порядку)
источник
Попробуй это:
источник
NULL
s, должен иметь хорошую производительность и легко обобщаться на большее количество столбцов.SQL FIDDLE
использование
MAX()
использование
CASE
источник
VALUES
гораздо более масштабируем, чем большоеCASE
выражение. Я также хотел бы узнать, почему за него проголосовали, поскольку избиратель, похоже, считает, что есть проблема с SQL, и поэтому, если они скажут нам эту проблему, мы все сможем извлечь из нее урок.На мой взгляд, Pivot - лучший и эффективный вариант для этого запроса. Скопируйте и вставьте в MS SQL SERVER. Пожалуйста, проверьте код, написанный ниже:
источник
Это действительно должно быть переоценено на уровне проектирования, как указали другие. Ниже приведен пример другого дизайна, использующего две таблицы, чтобы лучше выполнить то, что вы ищете в своих результатах. Это сделает рост намного более благоприятным.
Вот пример (используются разные имена таблиц):
Это позволяет добавлять больше типов дел, добавлять больше записей журнала и обеспечивает лучший дизайн.
Это всего лишь пример для учебных целей.
источник