我是 SQL 新手,所以这可能是一个微不足道的问题。我有一个包含如下数据的表:
State: varchar(30)
Year_06: varchar(10)
Year_07: varchar(10)
Year_08: varchar(10)
状态 | 年_06 | 年_07 | 年_08 |
---|---|---|---|
状态_1 | 991 | 01 | 37 |
状态_2 | 341 | 11 | 57 |
状态_3 | 551 | 41 | 不适用 |
现在,我必须找到每年各州的最大值。所以,对于Year_06
,答案是State_1
,依此类推。
我尝试使用降序对输出进行排序
SELECT * from table_name order BY Year_06::int desc;
这显示了这样的输出:
状态 | 年_06 | 年_07 | 年_08 |
---|---|---|---|
状态_1 | 991 | 01 | 37 |
状态_3 | 551 | 41 | 不适用 |
状态_2 | 341 | 11 | 57 |
但是,我想显示每年每个州的最高值。我怎样才能达到这个结果?
我会反转并重新聚合:
select distinct on (v.year) v.year, v.val, t.state
from t cross join lateral
(values ('Year_06', year_06),
('Year_07', year_07),
('Year_08', year_08)
) v(year, val)
order by v.year, v.val desc;
这是一个 db<>fiddle。
以上假设列中的值是数字,这NA
实际上意味着NULL
. 如果值是字符串,则需要将它们作为字符串进行排序或将它们转换为数字,例如:
select distinct on (v.year) v.year, v.val, t.state
from t cross join lateral
(values ('Year_06', year_06),
('Year_07', year_07),
('Year_08', year_08)
) v(year, val)
where v.val <> 'NA'
order by v.year, v.val::int desc;
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句