Oracle SQL选择查询
我有这张桌子:Oracle SQL选择查询,sql,oracle,Sql,Oracle,我有这张桌子: select * from scott.test; a b c --------- 26 R 4 26 T 5 26 S 2 25 Y 2 25 U 3 24 X 3 22 Z 3 21 P 3 我需要的是: 对于给定的“a”,我必须提取所有细节(a、b、c),如果有多个“a”,我只想提取“c”最高的一个。 例如,对于26,我只想提取: a b c 26 T 5 我是这样做的: select * from sco
select * from scott.test;
a b c
---------
26 R 4
26 T 5
26 S 2
25 Y 2
25 U 3
24 X 3
22 Z 3
21 P 3
我需要的是:
对于给定的“a”,我必须提取所有细节(a、b、c),如果有多个“a”,我只想提取“c”最高的一个。
例如,对于26,我只想提取:
a b c
26 T 5
我是这样做的:
select * from scott.test where a = 26 and c = (select max(c) from scott.test where a = 26);
但是我只需要一个select(而不是select中的select)。能做到吗?谢谢大家! 像这样
WITH test
AS (SELECT 26 AS a, 'R' AS b, 4 AS c FROM dual
UNION ALL
SELECT 26 AS a, 'T' AS b, 5 AS c FROM dual
UNION ALL
SELECT 26 AS a, 'S' AS b, 2 AS c FROM dual
UNION ALL
SELECT 25 AS a, 'Y' AS b, 2 AS c FROM dual
UNION ALL
SELECT 25 AS a, 'U' AS b, 3 AS c FROM dual
UNION ALL
SELECT 24 AS a, 'X' AS b, 3 AS c FROM dual
UNION ALL
SELECT 22 AS a, 'Z' AS b, 3 AS c FROM dual
UNION ALL
SELECT 21 AS a, 'P' AS b, 3 AS c FROM dual)
SELECT a, b, c
FROM (SELECT a, b, c, max(c) OVER (PARTITION BY a) AS max_c
FROM test
WHERE A = 26)
WHERE c = max_c
使用行数()分析函数可以实现它。但是,您需要使用子查询来完成此操作。但是使用WITH子句总是可以让它看起来不同
下面的查询将提示您输入列a
的值,并返回列c
最大值的行。WITH子句的第一部分仅用于构建示例数据进行演示,您只需要第二部分,即t
比如说,
将a
的值输入为26
:
SQL> WITH data AS
2 (SELECT 26 AS a, 'R' AS b, 4 AS c FROM dual
3 UNION ALL
4 SELECT 26 AS a, 'T' AS b, 5 AS c FROM dual
5 UNION ALL
6 SELECT 26 AS a, 'S' AS b, 2 AS c FROM dual
7 UNION ALL
8 SELECT 25 AS a, 'Y' AS b, 2 AS c FROM dual
9 UNION ALL
10 SELECT 25 AS a, 'U' AS b, 3 AS c FROM dual
11 UNION ALL
12 SELECT 24 AS a, 'X' AS b, 3 AS c FROM dual
13 UNION ALL
14 SELECT 22 AS a, 'Z' AS b, 3 AS c FROM dual
15 UNION ALL
16 SELECT 21 AS a, 'P' AS b, 3 AS c FROM dual
17 ),
18 t AS
19 ( SELECT a,b,c,row_number() OVER(PARTITION BY a ORDER BY c DESC) rn FROM DATA
20 )
21 SELECT a,b,c FROM t WHERE a = &1 AND rn = 1;
Enter value for 1: 26
old 21: SELECT a,b,c FROM t WHERE a = &1 AND rn = 1
new 21: SELECT a,b,c FROM t WHERE a = 26 AND rn = 1
A B C
---------- - ----------
26 T 5
将a
的值输入为25
:
SQL> WITH data AS
2 (SELECT 26 AS a, 'R' AS b, 4 AS c FROM dual
3 UNION ALL
4 SELECT 26 AS a, 'T' AS b, 5 AS c FROM dual
5 UNION ALL
6 SELECT 26 AS a, 'S' AS b, 2 AS c FROM dual
7 UNION ALL
8 SELECT 25 AS a, 'Y' AS b, 2 AS c FROM dual
9 UNION ALL
10 SELECT 25 AS a, 'U' AS b, 3 AS c FROM dual
11 UNION ALL
12 SELECT 24 AS a, 'X' AS b, 3 AS c FROM dual
13 UNION ALL
14 SELECT 22 AS a, 'Z' AS b, 3 AS c FROM dual
15 UNION ALL
16 SELECT 21 AS a, 'P' AS b, 3 AS c FROM dual
17 ),
18 t AS
19 ( SELECT a,b,c,row_number() OVER(PARTITION BY a ORDER BY c DESC) rn FROM DATA
20 )
21 SELECT a,b,c FROM t WHERE a = &1 AND rn = 1;
Enter value for 1: 25
old 21: SELECT a,b,c FROM t WHERE a = &1 AND rn = 1
new 21: SELECT a,b,c FROM t WHERE a = 25 AND rn = 1
A B C
---------- - ----------
25 U 3
试试这个。它可能会起作用:)
您需要使用用例和行数分析函数。你的问题中的“尽快”是什么意思?为了尽快得到答案,您应该提供一个工作测试用例。创建和插入语句。至少是SQL小提琴。显示数据对想要帮助你的人没有帮助。你在一个表上执行SQL,所以仅仅看数据人们只能猜测,而不能给你完全正确的答案。@LalitKumarB我想他希望尽快(尽快)得到答案——我认为这是非常正确的rude@RaduGheorghiu我知道。我正在向OP解释这件事。它看起来不像。。一个选择,但两个,即使它们是嵌套的。如果@user3913719告诉我们单表扫描,那么不管有多少子查询。不知道“在选择中不选择”是什么意思:)是的,我同意你的看法,但OP提到了关于表格扫描的任何内容吗?
select a,max(b) keep (dense_rank first order by c desc) b , max(c) keep (dense_rank first order by c desc) c from test
where a = 26
group by a