2012-07-12 117 views
1

我正在尝试在过程中创建select语句。如何从选择语句中的2个日期获取最后日期

这里是我的代码:

SELECT u.id, max(a.time), max(b.time) 
FROM buy a, sell b, users u 
WHERE a.user_id = u.id AND b.user_id = u.id 
GROUP BY u.id; 

我需要max(a.time)max(b.time)之间的最后日期。

在此先感谢

+0

使用情况a.time和b.time。 – Narendra 2012-07-12 09:07:03

+0

您使用的是什么DBMS? – 2012-07-12 09:31:03

回答

2
SELECT u.id, max(case when a.time > b.time then a.time else b.time end) 
FROM buy a, sell b, users u 
WHERE a.user_id = u.id AND b.user_id = u.id 
GROUP BY u.id; 

如果你的数据库支持别名的查询,试试这个这将是更有效的:如果他们存在,以获得最大

SELECT u.id, case when a_max > b_max then a_max else b_max end 
FROM (SELECT u.id, max(a.time) as a_max, max(b.time) as b_max 
    FROM buy a, sell b, users u 
    WHERE a.user_id = u.id AND b.user_id = u.id 
    GROUP BY u.id) x; 

内查询可以使用索引为每一列迅速。



虽然我们在这,让我们重新对码运用现代联接语法是:

SELECT u.id, max(case when a.time > b.time then a.time else b.time end) 
FROM buy a 
JOIN sell b ON b.user_id = u.id 
JOIN users u ON a.user_id = u.id 
GROUP BY u.id; 
+0

这真的是个好主意吗?当然应该聚合然后围绕聚合物包装CASE?这将使优化器有更多机会减少工作量。 – MatBailie 2012-07-12 09:08:03

+0

我不知道sql-developer是否支持别名查询,但是如果确实如此 - 请参阅编辑答案 – Bohemian 2012-07-12 09:09:15

+0

有一种方法可以优化此查询吗? – Ofer 2012-07-12 09:10:12

3

这个是什么?

SELECT 
    u.id, 
    CASE 
    WHEN max(a.time) > max(b.time) THEN max(a.time) 
    ELSE max(b.time) 
    END 
FROM buy a, sell b, users u 
WHERE a.user_id = u.id AND b.user_id = u.id 
GROUP BY u.id; 
+0

请注意,这将计算出四个max()函数 – Bohemian 2012-07-12 09:12:23

+0

将'CASE'更改为'CASE WHEN'? – MatBailie 2012-07-12 09:12:26

+0

@Bohemian - 不是我所知。它会计算'MAX(a.time)'一次并使用结果两次。 – MatBailie 2012-07-12 09:12:58

0
SELECT U.ID, 
CASE WHEN MAX(A.TIME) > MAX(B.TIME) THEN MAX(A.TIME) 
    ELSE MAX(B.TIME) 
END 
FROM BUY A, SELL B, USERS U 
WHERE A.USER_ID = U.ID AND B.USER_ID = U.ID 
GROUP BY U.ID; 
相关问题