2

下表包含三个用户随时间的状态变化。我正在尝试进行一个查询,返回所有用户状态的总和,但仅从今天最近的行开始

idEvent | date | user    | state
5       | 05/22 | client1 | 0 <- This number
4       | 05/22 | client2 | 1 <- Plus this number
3       | 05/12 | client1 | 0
2       | 05/12 | client2 | 0
1       | 05/02 | client3 | 1
有了这些数据,来自客户端的今天最新状态的总和为 1(client1 最近状态 = 0 和 client2 最近状态 = 1)。

到目前为止,我已经有了, 但它总结了一天中的每个状态,而不是最近的......
SELECT sum(a.states) FROM
(SELECT sum(state) AS states
FROM TABLE
WHERE day(date) = day(getdate()) AND month(date) = month(getdate()) AND year(date) = year(getdate())
group by user) a

谁能帮我 ?干杯:)

4

2 回答 2

1

一种方法是用于row_number()查找最近的行,如下所示:

select sum(t.states)
from (select t.*,
             row_number() over (partition by [user] order by [date] desc, idevent desc) as seqnum
      from [table] t
     ) t
where seqnum = 1;

这并不能保证它们是从今天开始的。为此,where需要一个子句:

select sum(t.states)
from (select t.*,
             row_number() over (partition by [user] order by [date] desc, idevent desc) as seqnum
      from [table] t
      where [date] >= cast(getdate() as date) and [date] < cast(getdate() + 1 as date)
     ) t
where seqnum = 1;

where子句不使用日期列上的任何函数,因此可以使用适当的索引(如果可用)。

于 2013-05-22T14:10:12.360 回答
0

使用 ROWNUMBER 和 PARTITION BY...

SELECT sum(STATE) FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY [USER] ORDER BY [DATE] DESC) AS ROWNUMBER FROM #TEMP ) T WHERE ROWNUMBER = 1

于 2013-05-22T14:15:26.713 回答