复杂的SQL取决于每个对象的插入时间?

时间:2015-04-20 11:42:07

标签: sql sql-server

嗨,所以这是表格:

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查询?

5 个答案:

答案 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
 )

See sql fiddle

答案 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_timeuser_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;