Я знаю, что мой ответ немного запоздал, но это может помочь другим. Есть способ добиться First () и Last () в SQL Server, и вот он:
Stuff(Min(Convert(Varchar, DATE_FIELD, 126) + Convert(Varchar, DESIRED_FIELD)), 1, 23, '')
Используйте Min () для First () и Max () для Last (). DATE_FIELD должна быть датой, определяющей, является ли это первой или последней записью. DESIRED_FIELD - это поле, в котором вы хотите указать первое или последнее значение. Что он делает:
- Добавить дату в формате ISO в начале строки (длиной 23 символа)
- Добавить DESIRED_FIELD к этой строке
- Получить значение MIN / MAX для этого поля (поскольку оно начинается с даты, вы получите первую или последнюю запись)
- Материал, который объединяет строку для удаления первых 23 символов (часть даты)
Вот, пожалуйста!
РЕДАКТИРОВАТЬ: у меня возникли проблемы с первой формулой: когда DATE_FIELD имеет .000 в виде миллисекунд, SQL Server возвращает дату в виде строки без НО миллисекунд вообще, таким образом удаляя первые 4 символа из DESIRED_FIELD. Я просто изменил формат на «20» (без миллисекунд), и все отлично работает. Единственным недостатком является то, что если у вас есть два поля, которые были созданы в одно и то же время, сортировка может быть грязной ... в этом случае вы можете вернуться к "126" для формата.
Stuff(Max(Convert(Varchar, DATE_FIELD, 20) + Convert(Varchar, DESIRED_FIELD)), 1, 19, '')
РЕДАКТИРОВАТЬ 2: Моим первоначальным намерением было вернуть последнюю (или первую) строку NON NULL. Меня спросили, как вернуть последний или первый ряд, будет ли он нулевым или нет. Просто добавьте ISNULL в DESIRED_FIELD. Когда вы объединяете две строки с оператором +, когда одна из них имеет значение NULL, результат равен NULL. Поэтому используйте следующее:
Stuff(Max(Convert(Varchar, DATE_FIELD, 20) + IsNull(Convert(Varchar, DESIRED_FIELD), '')), 1, 19, '')