如何查询仅出现特定列中具有最高值的行的行?
Posted
技术标签:
【中文标题】如何查询仅出现特定列中具有最高值的行的行?【英文标题】:How to query rows where only the rows with the highest value in a specific column appear? 【发布时间】:2021-01-23 17:14:18 【问题描述】:对不起,如果我的措辞令人困惑,自学 PL/SQL。我正在尝试根据一列查询具有最高值的行中的所有列。
示例:我有一个三行三列的表格 表:PTest
Ptest_no | Test_id | Test_inst
------------------------------
ABC11 | 1 | 1
ABC11 | 2 | 1
ABC11 | 2 | 2
我只需要获取包含所有列的顶行和底行(最终表格将有接近 10 列以上)
结果:
ABC11 | 1 | 1
ABC11 | 2 | 2
我试过了:
--但它只打印第三行。
select * from ptest
where test_inst = (select max(test_inst) from ptest);
--尝试自连接,认为子查询可以帮助指定条件。 --但只打印第三行
select a.Ptest_no, a.test_id, a.test_inst
from PTest a
join (select max(test_inst) as max_insty
from PTest b
where PTest_no = 'ABC11') on max_insty = a.test_inst
where PTest_no = 'ABC11';
--导致无效的关系运算符。 --我不确定这意味着什么。
select test_inst, ptest_no, test_id
from ptest
group by test_inst, ptest_no, test_id having max(test_inst);
目前正在尝试: - 再次尝试使用自我加入但使用 CASE,在使用 CASE 时遇到困难并且不确定如何正确结束它,如果它是最佳路线。注释掉案例并运行,仅打印第三行 - 在所有行上添加了第 4 行名称 ptest_snu,其值为“69”。不确定我为什么这样做。
select a.Ptest_no, a.test_id, a.test_inst, a.ptest_snu
from PTest a
--case
--when a.test_id = b.test_id then select max(test_inst)
--else (select * from Ptest a) end
join (select max(test_inst) as max_insty
from PTest b
where PTest_no = 'ABC11') on max_insty = a.test_inst
where a.ptest_snu = '69';
【问题讨论】:
首先弄清楚您实际使用的是哪个 RDBMS,并相应地标记您的问题 【参考方案1】:我认为这将返回您想要的结果:
select * from ptest
where
(
test_inst = (select max(test_inst) from ptest)
and
test_id = (select max(test_id) from ptest)
)
or
(
test_inst = (select min(test_inst) from ptest)
and
test_id = (select min(test_id) from ptest)
)
因此,两列必须等于这些列中的最高值或最低值。不只是其中任何一个。
【讨论】:
【参考方案2】:我怀疑您希望每个 test_id
中具有最大 test_inst
的行。如果是这样,这是每组最大 n 个问题;一种选择是使用相关子查询进行过滤:
select t.*
from ptest t
where t.test_inst = (
select max(t1.test_inst) from ptest t1 where t1.test_id = t1.test_id
)
你也可以使用窗口函数:
select *
from (
select t.*, row_number() over(partition by test_id order by test_inst desc) rn
from ptest t
) t
where rn = 1
【讨论】:
谢谢! windows 函数按预期工作,子查询的顶部选项仍然只拉出我一直得到的一行。感谢您对我的问题格式耐心等待,我有很多东西要学,您对 windows 功能的建议正好打开了我需要的大门。以上是关于如何查询仅出现特定列中具有最高值的行的行?的主要内容,如果未能解决你的问题,请参考以下文章