2

我有表:

id | uid | action
-----------------
 1 |  1  |   2
 2 |  3  |   1
 3 |  2  |   2
 4 |  3  |   2
 5 |  1  |   1

如何选择带有最后一个操作的 uid,例如 1?在这种情况下,只有最后一行。

更新:正如你所看到的 uid=3 首先我们有 action=1,然后 action=2 它意味着 uid=3 对我们来说不是“好”行。但是对于 uid=1,最后一个动作是 1,所以“好”行。

UPDATE2:action=1 是进入,action=2 是退出。最后,我需要获取现在正在构建的用户列表,或者至少是每个用户的最后操作列表。

4

3 回答 3

4

编辑:我在答案的末尾添加了一些解释。

DECLARE @Test TABLE(
    id INT, 
    [uid] INT, 
    [action] INT
);

INSERT  @Test(id , [uid] , [action])
SELECT  1 ,  1  ,   2
UNION ALL
SELECT  2 ,  3  ,   1
UNION ALL
SELECT  3 ,  2  ,   2
UNION ALL
SELECT  4 ,  3  ,   2
UNION ALL
SELECT  5 ,  1  ,   1;

DECLARE @last_action INT;
SET     @last_action = 1; --or = 2
SELECT  x.uid
FROM
(
SELECT  t.uid, 
        t.action,
        ROW_NUMBER() OVER(PARTITION BY t.[uid] ORDER BY t.id DESC) AS RowNum
FROM    @Test t
) x
WHERE   x.RowNum = 1
AND     x.action = @last_action 

结果:

uid         
----------- 
1          

说明: 从派生表查询(...) x将产生以下结果:

id uid action RowNum
-- --- ------ ------
5  1   1      1 <-- last action (1) for uid = 1
1  1   2      2
-- --- ------ ------
3  2   2      1 <-- last action (2) for uid = 2
-- --- ------ ------
4  3   2      1 <-- last action (2) for uid = 3
2  3   1      2
-- --- ------ ------
于 2012-04-28T10:45:34.967 回答
1

要获取表中的最后一行,您可以按 id 排序(看起来它每次都在增加一行)。然后,您可以使用 TOP 1 过滤每个查询的 1 行。

SELECT TOP 1 * FROM Table
WHERE action = 1
ORDER BY id DESC
于 2012-04-28T10:43:38.153 回答
0

SQLServer 方言,一种方式(多种方式)... - 假设列 id 定义顺序...升序... - 假设 id 是唯一的,至少对于每个 uid

select uid
from (
    select uid, max(id) as lastid
    from t
    group by uid
) l
join t on t.uid = l.uid and t.id = l.lastid
where t.action = 1

其他方式...

select uid
from t
where id in (select max(id) from t t2 where t2.uid = t.uid)
    and t.action = 1
于 2012-04-28T11:01:10.550 回答