sql - t-sql中按日期范围分组

标签 sql sql-server tsql

我正在尝试对此表进行查询:

Id       startdate     enddate       amount
1        2013-01-01   2013-01-31      0.00
2        2013-02-01   2013-02-28      0.00
3        2013-03-01   2013-03-31      245
4        2013-04-01   2013-04-30      529
5        2013-05-01   2013-05-31      0.00
6        2013-06-01   2013-06-30      383
7        2013-07-01   2013-07-31      0.00
8        2013-08-01   2013-08-31      0.00

我想得到输出:

2013-01-01          2013-02-28          0
2013-03-01          2013-06-30          1157
2013-07-01          2013-08-31           0

我想要得到这个结果,这样我就可以知道资金何时开始流入以及何时停止。我还对资金开始流入之前的月份数(这解释了第一行)以及资金停止的月份数感兴趣(这解释了为什么我也对 2013 年 7 月至 2013 年 8 月的第三行感兴趣)。

我知道我可以在日期上使用最小值和最大值,并在金额上使用总和,但我不知道如何以这种方式划分记录。
谢谢!

最佳答案

with CT as
(
    select t1.*,
           ( select max(endDate) 
             from t 
             where startDate<t1.StartDate and SIGN(amount)<>SIGN(t1.Amount)
           ) as GroupDate
    from t  as t1
) 
select min(StartDate) as StartDate,
       max(EndDate) as EndDate,
       sum(Amount) as Amount
from CT
group by GroupDate
order by StartDate

SQLFiddle demo

关于sql - t-sql中按日期范围分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17947584/

相关文章:

mysql - SQL 不喜欢返回所有行而不是差异

mysql - 我将如何执行此 MySQL 查询?

c# - 搜索用户并按 Redis 中最多的共同 friend 数量排序?

sql - 使用node js对SQL Server中的大量记录运行create或update

sql-server - SQL Server 将科学记数法(指数记数法)字符串转换为数字

sql - 使用每行返回两个值的函数插入

php - mysql用户订阅查询失败

sql - 跨服务器SQL

sql - Sql 中的 NULL 检查

tsql - 将 NAD83 State Plane 转换为 NAD83 UTM 的数学公式(最终目标是转换为 WGS84 Lat/Lng)