我有这张桌子:
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中选择)。可以吗?谢谢!
答案 0 :(得分:1)
使用 ROW_NUMBER()分析功能,您可以实现它。但是,您需要使用子查询来完成此操作。但是你总是可以使用 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
答案 1 :(得分:0)
喜欢这个? -
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
答案 2 :(得分:0)
试试这个。它可能应该工作:)。
class W
{
protected:
void Stuff() { /*...*/ };
void Finalize() { /*...*/ };
public:
virtual ~W() {}
virtual void Execute() { /*...*/ };
};
class X : public W
{
protected:
void Stuff() {
// X Stuff
W::Stuff();
};
public:
virtual ~X() {}
virtual void Execute() {
X::Stuff();
W::Finalize();
};
};
class Y : public X
{
void Stuff() {
// Y Stuff
X::Stuff();
};
public:
virtual ~Y() {}
virtual void Execute() {
Y::Stuff();
W::Finalize();
};
};