sql-server - 仅最大空值并将其他 SQL Server 分组
问题描述
我有一张这样的桌子:
Department |Jan |Feb |Mar | Apr|
+-----------+----+----+----+----+
|A | 1 |NULL|NULL|NULL|
|A |NULL|NULL|2 |NULL|
|A |NULL|NULL|NULL|7 |
|B | 1 |NULL|2 |NULL|
|B |NULL|NULL|5 |NULL|
|B |NULL|6 |NULL|NULL|
我希望输出是:
+-----------+----+----+----+----+
|Department |Jan |Feb |Mar | Apr|
+-----------+----+----+----+----+
|A | 1 |NULL|2 |7 |
|B | 1 |6 |2 |NULL|
|B |NULL|NULL|5 |NULL|
有人知道如何做到这一点吗?
实际上我只想对空值做最大值,然后对其余的值进行分组..
解决方案
如果顺序并不重要(正如您在评论中所说),那么您可以使用ROW_NUMBER()
窗口功能:
with cte as (
select *,
row_number() over (partition by [Department] order by [Jan]) rn1,
row_number() over (partition by [Department] order by [Feb]) rn2,
row_number() over (partition by [Department] order by [Mar]) rn3,
row_number() over (partition by [Department] order by [Apr]) rn4
from tablename
)
select c1.[Department], c1.[Jan], c2.[Feb], c3.[Mar], c4.[Apr]
from cte c1
inner join cte c2 on c2.[Department] = c1.[Department] and c2.rn2 = c1.rn1
inner join cte c3 on c3.[Department] = c1.[Department] and c3.rn3 = c1.rn1
inner join cte c4 on c4.[Department] = c1.[Department] and c4.rn4 = c1.rn1
where coalesce(c1.[Jan], c2.[Feb], c3.[Mar], c4.[Apr]) is not null
order by c1.[Department], c1.[Jan] desc, c2.[Feb] desc, c3.[Mar] desc, c4.[Apr] desc
请参阅演示。
结果:
> Department | Jan | Feb | Mar | Apr
> :--------- | ---: | ---: | --: | ---:
> A | 1 | null | 2 | 7
> B | 1 | 6 | 5 | null
> B | null | null | 2 | null
推荐阅读
- php - 从托管在 Heroku 的在线 PHP 站点连接数据库
- python - 如何允许脚本执行但不读取?
- unit-testing - 模拟服务的导入模块
- python - 在多个数据帧中使用 rename 函数遍历 pandas 数据帧字典以重命名列
- r - 使用 case_when 按日期范围对变量进行分类?
- javascript - 使用 react-router 更改 url 和传递值
- node.js - 如何在不使用 webhook 客户端的情况下设置对话流履行响应 json 上下文?
- docker - 限制用户访问 docker 内的代码
- maven - TestRunner 初始化错误
- r - ggplot-bar 的 R 输出给出了错误的 y 轴值