私の答えは少し遅れていることは知っていますが、それは他の人を助けるかもしれません。SQL ServerでFirst()とLast()を実現する方法があり、次のようになります。
Stuff(Min(Convert(Varchar, DATE_FIELD, 126) + Convert(Varchar, DESIRED_FIELD)), 1, 23, '')
First()にはMin()を使用し、Last()にはMax()を使用します。DATE_FIELDは、それが最初のレコードであるか最後のレコードであるかを決定する日付である必要があります。DESIRED_FIELDは、最初または最後の値が必要なフィールドです。それがすることは:
- 文字列の先頭にISO形式の日付を追加します(23文字の長さ)
- その文字列にDESIRED_FIELDを追加します
- そのフィールドのMIN/MAX値を取得します(日付で始まるため、最初または最後のレコードを取得します)
- 文字列を連結して最初の23文字(日付部分)を削除するもの
どうぞ!
編集:最初の数式で問題が発生しました:DATE_FIELDのミリ秒が.000の場合、SQL Serverは日付をミリ秒なしの文字列として返すため、DESIRED_FIELDから最初の4文字が削除されます。フォーマットを「20」(ミリ秒なし)に変更しただけで、すべてうまく機能します。唯一の欠点は、同じ秒数で作成された2つのフィールドがある場合、並べ替えが煩雑になる可能性があることです。この場合、形式を「126」に戻すことができます。
Stuff(Max(Convert(Varchar, DATE_FIELD, 20) + Convert(Varchar, DESIRED_FIELD)), 1, 19, '')
編集2:私の当初の意図は、最後の(または最初の)NONNULL行を返すことでした。nullかどうかに関係なく、最後の行または最初の行を返す方法を尋ねられました。ISNULLをDESIRED_FIELDに追加するだけです。+演算子を使用して2つの文字列を連結する場合、そのうちの1つがNULLの場合、結果はNULLになります。したがって、次を使用します。
Stuff(Max(Convert(Varchar, DATE_FIELD, 20) + IsNull(Convert(Varchar, DESIRED_FIELD), '')), 1, 19, '')