[英]Select MAX value and GROUP BY
I'm trying to extract ID values where End_Time for type A is not equal to Max End_Time of each System_Id我正在尝试提取 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
So end result should be:所以最终结果应该是:
ID System_ID Type End_Time
1 1 A 10:00
For now I was trying this:现在我正在尝试这个:
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
)
I think this query should be somewhat ok, because if I ask in the subquery for a specific ID, and outside it - it returns a proper answer.我认为这个查询应该没问题,因为如果我在子查询中询问特定 ID,并且在它之外 - 它会返回一个正确的答案。 I think that I need to somehow group it also by ID, however I don't really know how.我认为我还需要以某种方式按 ID 对其进行分组,但我真的不知道如何操作。 Database is Oracle if that changes some things.如果改变了一些东西,数据库是 Oracle。
Use EXISTS
:使用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
);
or a self join:或自我加入:
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';
You can use the RANK
analytic function:可以使用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;
Or, the MAX
analytic function:或者, 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;
Or, can fix your query by correlating the sub-query to the outer query:或者,可以通过将子查询与外部查询相关联来修复您的查询:
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 )
Note: The first two queries only SELECT... FROM TestTable
once and the outer query is purely for filtering the existing data.注意:前两个查询仅SELECT... FROM TestTable
一次,外部查询纯粹用于过滤现有数据。 The final query SELECT... FROM TestTable
twice and will likely be less efficient.最终查询SELECT... FROM TestTable
两次,效率可能会降低。
Then, for the sample data:然后,对于示例数据:
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;
All queries output:所有查询 output:
ID ID SYSTEM_ID系统编号 TYPE类型 END_TIME时间结束 1 1个 1 1个 A一种 +00 10:00:00 +00 10:00:00
Yes, you are right, GROUP BY should be used for this query.是的,你没看错,这个查询应该使用 GROUP BY。 Please try:请尝试:
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.