获取对应的值到另一列的最大值
Obtain corresponding value to max value of another column
我需要找到与另一列最大值对应的值。
我的数据如下:
group
subgroup
subgroup_2
value_a
value_b
date
A
101
1
200
101
20220301
A
102
1
105
90
20220301
A
103
2
90
202
20220301
A
211
2
75
107
20220301
B
212
1
91
65
20220301
B
213
1
175
101
20220301
我需要像这样格式化数据:
group
subgroup_2
max_value_a
value_b
date
A
1
200
101
20220301
A
2
90
202
20220301
B
1
175
101
20220301
我可以通过分组相当轻松地实现格式,但是我必须聚合 value_b 才能做到这一点,这并没有给我需要的结果。
我知道我可以在分区依据上使用 rank(),但它似乎没有提供我需要的格式。
这是我在下面使用的查询,但它只提供一个 subgroup_2 的最大值,而不是每个的最大值:
select group, subgroup_2, max_value_a, value_b, date
from
(
select a.group, a.subgroup_2, a.max_value_a, a.value_b, a.date,
rank() over(partition by a.group, subgroup_2, a.date order by a.max_value_a desc) as rnk
from table_1 a
)s
where rnk=1
您想在此处使用 ROW_NUMBER
:
SELECT group, subgroup_2, value_a AS max_value_a, value_b, date
FROM
(
SELECT group, subgroup_2, value_a, value_b, date,
ROW_NUMBER() OVER (PARTITION BY group, subgroup_2 ORDER BY value_a DESC) rn
FROM table_1
) t
WHERE rn = 1;
我需要找到与另一列最大值对应的值。
我的数据如下:
group | subgroup | subgroup_2 | value_a | value_b | date |
---|---|---|---|---|---|
A | 101 | 1 | 200 | 101 | 20220301 |
A | 102 | 1 | 105 | 90 | 20220301 |
A | 103 | 2 | 90 | 202 | 20220301 |
A | 211 | 2 | 75 | 107 | 20220301 |
B | 212 | 1 | 91 | 65 | 20220301 |
B | 213 | 1 | 175 | 101 | 20220301 |
我需要像这样格式化数据:
group | subgroup_2 | max_value_a | value_b | date |
---|---|---|---|---|
A | 1 | 200 | 101 | 20220301 |
A | 2 | 90 | 202 | 20220301 |
B | 1 | 175 | 101 | 20220301 |
我可以通过分组相当轻松地实现格式,但是我必须聚合 value_b 才能做到这一点,这并没有给我需要的结果。
我知道我可以在分区依据上使用 rank(),但它似乎没有提供我需要的格式。
这是我在下面使用的查询,但它只提供一个 subgroup_2 的最大值,而不是每个的最大值:
select group, subgroup_2, max_value_a, value_b, date
from
(
select a.group, a.subgroup_2, a.max_value_a, a.value_b, a.date,
rank() over(partition by a.group, subgroup_2, a.date order by a.max_value_a desc) as rnk
from table_1 a
)s
where rnk=1
您想在此处使用 ROW_NUMBER
:
SELECT group, subgroup_2, value_a AS max_value_a, value_b, date
FROM
(
SELECT group, subgroup_2, value_a, value_b, date,
ROW_NUMBER() OVER (PARTITION BY group, subgroup_2 ORDER BY value_a DESC) rn
FROM table_1
) t
WHERE rn = 1;