ms sql last\ u value()排序依据

dhxwm5r4  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(310)

我需要为 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

如果我写下面的话,它似乎做了一个 Maxval 按字母顺序:

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 ?

5vf7fwbs

5vf7fwbs1#

首先,我推荐 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() .

eanckbw9

eanckbw92#

为什么要分组两次?你就不能把Windows改一下吗?

SELECT DISTINCT 
    a.group_id
    ,FIRST_VALUE(a.val) OVER (PARTITION BY a.group_id 
                              ORDER BY a.id DESC 
                              ROWS BETWEEN 
                              UNBOUNDED PRECEDING AND 
                              UNBOUNDED FOLLOWING) AS last_val
FROM #temp1

相关问题