繁体   English   中英

Select MAX 值和 GROUP BY

[英]Select MAX value and GROUP BY

我正在尝试提取 ID 值,其中类型 A 的 End_Time 不等于每个 System_Id 的 Max End_Time

ID     System_Id Type  End_Time
1        1         A    10:00
1        1         B    12:00
1        2         A    14:00
1        2         B    14:00
2        3         A    07:00
2        3         B    07:00

所以最终结果应该是:

ID    System_ID   Type  End_Time
1        1          A     10:00

现在我正在尝试这个:

Select ID 
From TestTable t 
WHERE t.Type LIKE 'A'
AND t.End_Time < 
(
    SELECT MAX(t2.End_Time)
    From TestTable t2
    Order by System_Id
)

我认为这个查询应该没问题,因为如果我在子查询中询问特定 ID,并且在它之外 - 它会返回一个正确的答案。 我认为我还需要以某种方式按 ID 对其进行分组,但我真的不知道如何操作。 如果改变了一些东西,数据库是 Oracle。

使用EXISTS

SELECT t1.*
FROM TestTable t1
WHERE t1.Type = 'A'
  AND EXISTS (
        SELECT *
        FROM TestTable t2
        WHERE t2.ID = t1.ID AND t2.End_Time > t1.End_Time 
      );

或自我加入:

SELECT DISTINCT t1.*
FROM TestTable t1 INNER JOIN TestTable t2
ON t2.ID = t1.ID AND t2.End_Time > t1.End_Time
WHERE t1.Type = 'A';

请参阅演示

可以使用RANK解析function:

SELECT ID, System_Id, Type, End_Time
FROM   (
  SELECT t.*,
         RANK() OVER (PARTITION BY system_id ORDER BY end_time DESC) AS rnk
  FROM   testtable t
)
WHERE  type = 'A'
AND    rnk > 1;

或者, MAX解析function:

SELECT ID, System_Id, Type, End_Time
FROM   (
  SELECT t.*,
         MAX(end_time) OVER (PARTITION BY system_id) AS max_end_time
  FROM   testtable t
)
WHERE  type = 'A'
AND    end_time < max_end_time;

或者,可以通过将子查询与外部查询相关联来修复您的查询:

SELECT *
FROM   TestTable t 
WHERE  t.Type = 'A'
AND    t.End_Time < ( SELECT MAX(t2.End_Time)
                      FROM   TestTable t2
                      WHERE  t.system_id = t2.system_id )

注意:前两个查询仅SELECT... FROM TestTable一次,外部查询纯粹用于过滤现有数据。 最终查询SELECT... FROM TestTable两次,效率可能会降低。


然后,对于示例数据:

CREATE TABLE testtable (ID, System_Id, Type, End_Time) AS
SELECT 1, 1, 'A', INTERVAL '10:00' HOUR TO MINUTE FROM DUAL UNION ALL
SELECT 1, 1, 'B', INTERVAL '12:00' HOUR TO MINUTE FROM DUAL UNION ALL
SELECT 1, 2, 'A', INTERVAL '14:00' HOUR TO MINUTE FROM DUAL UNION ALL
SELECT 1, 2, 'B', INTERVAL '14:00' HOUR TO MINUTE FROM DUAL UNION ALL
SELECT 2, 3, 'A', INTERVAL '07:00' HOUR TO MINUTE FROM DUAL UNION ALL
SELECT 2, 3, 'B', INTERVAL '07:00' HOUR TO MINUTE FROM DUAL;

所有查询 output:

ID 系统编号 类型 时间结束
1个 1个 一种 +00 10:00:00

db<> 在这里摆弄

是的,你没看错,这个查询应该使用 GROUP BY。 请尝试:

SELECT t1.ID
FROM   Testtable T1
       INNER JOIN (
         SELECT ID, MAX(END_TIME) AS END_TIME_MAX
         FROM Testtable
         GROUP BY ID
       ) T2
       ON T1.ID = T2.ID
WHERE  T1.END_TIME < T2.END_TIME_MAX
AND    T1.Type = 'A'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM