嗨,所以这是表格:
Select * from LogTable order by insert_time desc
LogTable:
|user_id|action|object_id|insert_time|
|2 |start |123 |20.04.2015 |
|2 |stop |123 |19.04.2015 |
|2 |start |123 |17.04.2015 |
|1 |stop |321 |16.04.2015 |
|1 |start |321 |12.04.2015 |
|3 |start |1234 |11.04.2015 |
|4 |start |12345 |5.04.2015 |
|4 |stop |12345 |3.04.2015 |
...
现在我想选择所有具有相同对象的用户ID,但这些用户ID从未停止但从未重新启动。因此,应选择只有id = 1 的用户。应该如何编写sql查询?
答案 0 :(得分:5)
您似乎希望action
的最后一个值为stop
的所有用户。以下是使用row_number()
的一种方法:
select lt.*
from (select lt.*,
row_number() over (partition by user_id, object_id
order by insert_time desc) as seqnum
from logtable lt
) lt
where seqnum = 1 and action = 'stop';
答案 1 :(得分:2)
试试这个:
SELECT T1.*
FROM LogTable T1
WHERE T1.Action = 'stop'
AND NOT EXISTS (
SELECT 1
FROM LogTable T2
WHERE T1.UserId = T2.UserId
AND T2.Action = 'start'
AND T1.insert_time < T2.insert_time
)
答案 2 :(得分:0)
使用GROUP BY
,为user_id验证两行,并使用不同的操作值。
select user_id
from LogTable
group by user_id
having count(*) = 2
and count(distinct action) = 2
答案 3 :(得分:0)
您可以按insert_time
每user_id
加入记录,如果记录代表stop
,则选择记录。
SELECT l.*
FROM LogTable l
INNER JOIN (SELECT user_id, MAX(insert_time) AS insert_time
FROM LogTable
GROUP BY user_id) t
ON t.user_id = l.user_id AND l.insert_time = t.insert_time
WHERE l.action = 'stop'
答案 4 :(得分:-2)
SELECT DISTINCT(userid) FROM (
SELECT userid, action from LogTableorder
GROUP BY userid, object_id
HAVING insert_time = max(insert_time)
) WHERE action=stop;