我需要为 group_id
订购人 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
?
2条答案
按热度按时间5vf7fwbs1#
首先,我推荐
FIRST_VALUE()
按降序排序。然后,你需要使用正确的ORDER BY
列:为什么我更喜欢
FIRST_VALUE()
为了这个?问题是默认的窗口框架,即BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
. 这可能会与意外的LAST_VALUE()
.eanckbw92#
为什么要分组两次?你就不能把Windows改一下吗?