【问题标题】:Counting with Increments in SQLSQL 中的增量计数
【发布时间】:2013-12-04 17:33:25
【问题描述】:

我有这样一种情况,即在指定时间段内将折扣应用于帐户,然后又改回原来的折扣。

Disount    Date
  10        1/1/2013
  10        1/2/2013
  20        1/3/2013
  20        1/4/2013
  20        1/5/2013
  10        1/6/2013
  10        1/7/2013

我想通过递增计数来识别变化

Disount    Date       Identify
  10        1/1/2013     1
  10        1/2/2013     1
  20        1/3/2013     2
  20        1/4/2013     2 
  20        1/5/2013     2
  10        1/6/2013     3
  10        1/7/2013     3

我试过了:

DECLARE @groupercount int
SET @groupercount = 1

在使用的case语句中:

when <whatever> then @groupcount
else @groupcount +1

这只会在识别列中产生 1 或 2,不会增加到 3、4、5 等等。

有什么想法吗?

【问题讨论】:

  • 您使用的是什么 DBMS 和版本? SQL Server、mySQL 等

标签: sql increment


【解决方案1】:

您似乎想要将折扣相同的期间相加(基于日期)。您的语法看起来像 SQL Server 语法。以下是 SQL Server 2012 语法(这也适用于 Postgres 和 Oracle):

select t.discount, t.date,
       (sum(NewPeriodStart) over (order by date)) as Identify
from (select t.*,
             (case when t.discount = lag(t.discount) over (order by date) then 0 else 1
              end) as NewPeriodStart
      from t
     ) t;

如果您没有lag() 和累积sum(),您仍然可以只使用row_number() 和基本窗口函数:

select discount, date, dense_rank() over (partition by groupid order by mindate) as Identify
from (select t.*, min(date) over (partition by groupid) as mindate
      from (select t.*,
                   (row_number() over (order by date) -
                    row_number() over (partition by discount order by date)
                   ) as groupid
            from t
           ) t
     ) t;

【讨论】:

    猜你喜欢
    • 2016-10-29
    • 1970-01-01
    • 2023-02-22
    • 1970-01-01
    • 2023-03-10
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    相关资源
    最近更新 更多