sql - MS SQL LAST_VALUE() 排序依据
问题描述
我需要从以下示例表中选择group_id
order by的最后一个值:id
drop table if exists #temp1
create table #temp1 (group_id int, id int, val varchar(10))
insert into #temp1 values (1111, 1, 'Yes')
insert into #temp1 values (1111, 2, 'No')
insert into #temp1 values (1111, 3, NULL)
insert into #temp1 values (2222, 5, 'No')
insert into #temp1 values (2222, 3, NULL)
insert into #temp1 values (2222, 1, 'No')
预期结果是1111 - Yes
和2222 - No
。
如果我编写以下查询,它似乎会根据行在表中的排序方式而不是按id
列来选择最后一个值。
SELECT group_id, MAX(last_val)
FROM
(
SELECT a.group_id, LAST_VALUE(a.val) OVER (PARTITION BY a.group_id ORDER BY a.group_id) AS last_val FROM #temp1 a
) a
GROUP BY group_id
如果我写以下内容,它似乎Max
按val
字母顺序执行:
SELECT group_id, MAX(last_val)
FROM
(
SELECT a.group_id, LAST_VALUE(a.val) OVER (PARTITION BY a.group_id ORDER BY a.id) AS last_val FROM #temp1 a
) a
GROUP BY group_id
在这两种情况下,结果都与我需要的不同。有人可以建议如何获得val
最后一个id
吗?
解决方案
首先,我建议FIRST_VALUE()
使用降序排序。然后,您需要使用右ORDER BY
列:
SELECT group_id, MAX(last_val)
FROM (SELECT a.group_id,
FIRST_VALUE(a.val) OVER (PARTITION BY a.group_id ORDER BY a.id DESC) AS last_val
FROM #temp1 a
) a
GROUP BY group_id;
为什么我更喜欢FIRST_VALUE()
这个?问题是默认窗口框架,即BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
. 这可能会与LAST_VALUE()
.
推荐阅读
- ajax - 使用 ajax 选择的 Octobercms 无法按预期工作
- ruby - 在没有 Rails 或安装 gems 的情况下在 Ruby 中获取太平洋时间
- java - requests.exceptions.ConnectionError: HTTPSConnectionPool(host='', port=2376): Max retries exceeded with url: /v1.24/version - Windows 上的 Docker
- android - 尝试响应 android 数字软键盘上的刻度时,onEditor 操作不起作用
- spring-boot - 无法在 QueryBuilders.termQuery 的帮助下获取数据
- python - 计算样本的标准偏差
- java - Tesseract OCR 不适用于 Java Web 应用程序
- c# - 如何在c#中从一行删除到文本文件的末尾?
- python - 使用 Pool.map() 类型错误的多线程 PhantomJS
- c# - 使用来自多个文件的任何 CPU (x64/x86)