如何查询仅出现特定列中具有最高值的行的行?

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 功能的建议正好打开了我需要的大门。

以上是关于如何查询仅出现特定列中具有最高值的行的行?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用AWK将包含特定字符串的行之后的行的第三列中的值打印到不同的文件?

如何查询所有仅具有最高值的不同行?

在根据最大列值理解行的同时查找具有最高值的行的列名

如何对特定列中具有相同值的行求和

MS Access 查询:合并特定字段列中具有相同数据的行

如何在 SQL 查询中仅检查从存储过程返回的行的第一个值