SQL查询,基于连接表中的最后一个值进行过滤

时间:2013-06-04 17:28:38

标签: sql postgresql

我遇到嵌套查询的问题(问题因为我不知道怎么做) 我正在使用PostgreSQL

我有两张桌子:

users
id name
1 x
2 y
3 z

call
id user_id time data
1 1 00:10 stat1
2 1 00:15 stat2
3 3 00:10 stat2
4 3 00:30 stat1
5 3 00:45 stat2
6 3 00:50 stat3

我需要获得的是一组用户,但前提是他们的最后一次调用是stat2。我遇到的问题是我不知道如何只检查最新的数据。

我的查询:

SELECT users.*, call.* FROM users, call WHERE users.id=call.user_id AND call.id IN (SELECT id FROM call WHERE call.data='stat2') ORDER BY users.id

我得到的是:

users
id name id user_id time data
1 x 2 1 00:15 stat2
3 z 3 3 00:10 stat2
3 z 5 3 00:45 stat2

我需要得到的是:

users
id name id user_id time data
1 x 1 1 00:15 stat2

3不应该显示,因为它的最后一个值是stat 3(显然不应该加倍,因为我有2个统计数据。

我可以通过多个查询来完成,但我想在1中完成。

由于

2 个答案:

答案 0 :(得分:1)

因此,您希望获取每个Users.id最后呼叫ID。你可以用一组来做到这一点。然后,一旦获得最后一个呼叫ID,您将检查该最后呼叫ID的状态是否为stat2

查询如下:

SELECT *
FROM USERS U
INNER JOIN
  (SELECT user_id, MAX(id) AS last_id
   FROM Calls c
   GROUP BY user_id
  ) t0
ON t0.user_id = u.id
INNER JOIN Calls c ON c.id = t0.last_id
WHERE c.type = 'stat2'

示例小提琴:http://www.sqlfiddle.com/#!1/7016e/5

答案 1 :(得分:0)

尝试使用ALL语句:

SELECT users.*, call.* FROM users, call WHERE users.id=call.user_id AND call.id IN (SELECT id FROM call WHERE call.data='stat2') 
AND call.time >= all (select a.time from call a where a.user_id = users.id) ORDER BY users.id

这意味着所选行中的时间是> =该用户所有通话的时间。