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

我有一张看起来像上面的桌子。我试图弄清楚如何获取其 Number 列加起来达到某个值的最新记录(按时间戳排序的表)。

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

2 (Business), 3 (Pleasure)

有任何想法吗?

4

3 回答 3

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
于 2013-03-02T00:26:42.740 回答
1

您是否尝试过使用光标

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

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

于 2013-03-01T23:38:40.153 回答
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 子句来完成。

于 2013-03-02T20:05:13.913 回答