sql - 计算跨越多个日期范围的记录

标签 sql sql-server database

ACCOUNT   Amount     DATE
1     50        01-2010
1     100       03-2010
1     100       02-2011
2     100       01-2011
2     50        05-2011
2     50        09-2011
3     100       03-2012
3     100       03-2013

是否有一种查询结构可以让我计算跨越当前和过去一年的不同账户?例如,账户 1 有 2011 年和 2010 年的金额,因此它应该在 2011 年计算一次。账户 2 只有 2011 年的金额,因此不会被计算在内,而账户 3 有 2013 年和 2012 年的金额,因此它被计算为 1 2013 年以下:

 2010   2011    2012    2013                
 0      1       0       1

最佳答案

首先,您需要知道您拥有帐户数据的年份:

select account, year(date) as yr
from t
group by account, year(date)

接下来,您需要查看两年是否按顺序排列。你可以在 2012 年以滞后/领先的方式做到这一点。相反,我们将只使用自连接:

with ay as (
     select account, year(date) as yr
     from t
     group by account, year(date)
    )
select ay.account, ay.yr
from ay join
     ay ayprev
     on ay.account = ayprev.account and
        ay.yr = ayprev.yr + 1

接下来,如果你想按年计算账户数量,只需将其放入一个聚合中即可:

with ay as (
     select account, year(date) as yr
     from t
     group by account, year(date)
    )
select yr, count(*) as numaccounts
from (select ay.account, ay.yr
      from ay join
           ay ayprev
           on ay.account = ayprev.account and
              ay.yr = ayprev.yr + 1
     ) ayy
group by yr

关于sql - 计算跨越多个日期范围的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12151389/

相关文章:

sql - 更新语句-地理列-sql server

c# - SQL 中的字符串函数而不是 C#

sql-server - 是否需要关闭node js中与SQL Server的数据库连接?

sql - 面向页面的嵌套循环连接 - 查询优化

sql - 在 sql 中跟踪记录随时间的更新有哪些最佳实践?

sql - 计算sql中条目之间的时间

java - android.database.sqlite.SQLiteConstraintException : UNIQUE constraint failed:

mysql - 如何删除 mysql 数据库中表中的所有行,其中一列的值 = 0?

sql - 如何在 SQL (Oracle) 中随机排列数据?

sql-server - OpenSQLServerInstanceRegKey :GetRegKeyAccessMask failed (reason: 2)