我知道我的回答有点晚了,但这可能对其他人有所帮助。有一种方法可以在 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”(没有毫秒),效果很好。唯一的缺点是如果您有两个在同一秒内创建的字段,排序可能会很混乱......在这种情况下,您可以将格式恢复为“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, '')