选择其总和加起来为某个值的排名记录

时间:2013-03-01 23:34:33

标签: sql sql-server sql-server-2008 tsql

+----+--------+----------+-----------+
| ID | Number | Reason   | Timestamp |
+----+--------+-----------+----------+
|  1 | 2      | Business | date      |
|  2 | 3      | Pleasure | date      |
+----+--------+-----------+----------+

我有一张看起来像上面的桌子。我正在试图找出如何获得最新记录(按时间戳排名的表),其数字列加起来为某个值。

所以在上面的例子中,如果我的值为5,我会想要这两个记录(假设它们是最新的)。我想获得如下输出字符串:

2 (Business), 3 (Pleasure)

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

如果您要查找最多不超过X的记录,则需要累积总和。在SQL Server 2008中,使用相关子查询来处理:

select t.*
from (select t.*,
             (select sum(number) from t t2 where t2.id <= t.id) as CumeSumValue
      from t
     ) t
where CumeSumValue <= X

我认为>=需要更多逻辑。

select t.*
from (select t.*,
             (select sum(number)
              from t t2
              where t2.id <= t.id
             ) as CumeSumValue
      from t
     ) t
where CumeSumValue <= X or   -- less than or equal
      ((CumeSumValue - Number < X) and (CumeSumValue > X))  -- first that is greater than
      CumeSumValue >= X

答案 1 :(得分:1)

您是否尝试过使用光标

这看起来像是使用游标的主要示例。

http://msdn.microsoft.com/de-de/library/ms180169.aspx

答案 2 :(得分:1)

首先你应该得到最新的记录

Select Max(ID) MAXID Into #t From t Group By Timestamp 

现在#t所有可用的最新记录。您可以使用表格访问所有字段:

Select t.* from t Join #t on t.ID = #t.MAXID

如果你想过滤一些东西,可以用简单的where子句来完成。