【问题标题】:Need to get cumulative count distinct by periods (year,month)需要按时期(年,月)区分累积计数
【发布时间】:2016-04-02 23:39:01
【问题描述】:

我已经设法获得了按月计算的累积不同计数,但在尝试按年计算时却无法获得。我尝试了分区功能,但我不断收到各种错误,这就是我到目前为止所得到的。你能给我一些指导吗,我是新手。

[SQL 小提琴][1]

PostgreSQL 9.3 架构设置

create table table2 (id serial, fecha_captura date, mn integer, VALUACION1 integer);

    insert into table2 (fecha_captura, mn, VALUACION1)
    values
    ('1996-02-01',2,12345),
    ('1996-02-01',2,12345),
    ('1996-02-01',2,12344),
    ('1996-02-01',2,12343),
    ('1996-03-01',3,12345),
    ('1996-03-01',3,12346),
    ('1996-03-01',3,12347),
    ('1996-03-01',3,12348),
    ('1996-04-01',4,12349),
    ('1996-04-01',4,12350),
    ('1996-04-01',4,12351),
    ('1996-04-01',4,12352),
    ('1997-03-01',4,12353),
    ('1997-03-01',4,12354),
    ('1997-03-01',4,12345),
    ('1997-03-01',4,12352),
    ('1997-04-01',4,12353),
    ('1997-04-01',4,12354),
    ('1997-04-01',4,12345),
    ('1997-04-01',4,12355);

查询 1

SELECT Year1,mn,
   COUNT(DISTINCT(VALUACION1)) AS Val_Dist_Mes
  ,SUM(flag) AS Val_Dist_Mes_Nuevas
  ,SUM(SUM(flag)) 
   OVER (partition by Year1 ORDER BY mn,Year1
         ROWS UNBOUNDED PRECEDING) AS Val_Dist_Acum 
FROM
 (
   SELECT
      VALUACION1
     ,EXTRACT(MONTH FROM fecha_captura) AS mn
     ,EXTRACT(YEAR FROM fecha_captura) AS Year1
     ,CASE
         WHEN EXTRACT(MONTH FROM fecha_captura) 
              = MIN (EXTRACT(MONTH FROM fecha_captura))
              OVER (PARTITION BY VALUACION1) 
         THEN 1 
         ELSE 0 
      END AS flag
   FROM table2
   GROUP BY fecha_captura,VALUACION1
 ) AS dt
GROUP BY mn,Year1

[结果][2]

| year1 | mn | val_dist_mes | val_dist_mes_nuevas | val_dist_acum |
|-------|----|--------------|---------------------|---------------|
|  1996 |  2 |            3 |                   3 |             3 |
|  1996 |  3 |            4 |                   3 |             6 |
|  1996 |  4 |            4 |                   3 |             9 |
|  1997 |  3 |            4 |                   3 |             3 |
|  1997 |  4 |            4 |                   1 |             4 |

[预期结果][2]

| year1 | mn | val_dist_mes | val_dist_mes_nuevas | val_dist_acum  |
|-------|----|--------------|---------------------|----------------|
|  1996 |  2 |            3 |                   3 |             3  |
|  1996 |  3 |            4 |                   3 |             6  |
|  1996 |  4 |            4 |                   4 |             10 |
|  1997 |  3 |            4 |                   4 |             4  |
|  1997 |  4 |            4 |                   1 |             5  |

【问题讨论】:

  • 我期待这样的事情
  • 年 |百万 | val_dist_mes | val_dist_mes_nuevas | val_dist_acum | ------ |--------|--------------------|---------------- -------------|----------| 1996 | 2 | 3 | 3 | 3 | 1996 | 3 | 4 | 3 | 6 | 1996 | 4 | 4 | 4 | 10 | 1997 | 4 | 1 | 1 | 1 |
  • 查询似乎包含 transact-sql 细节,你应该删除不相关的标签
  • SAS 标记在这里似乎也不相关。如果 T-SQL 可能更具体的 SQL 标记是合适的。
  • 如果是 SAS,我建议使用保留语句为您的累积计数设置一个数据步骤。在 SQL 中运行总计从来都不是直截了当的。

标签: sql postgresql cumulative-frequency


【解决方案1】:

group bypartition by 中添加Year 应该可以解决问题

SELECT AÑO, 
       mn, 
       Count(DISTINCT( valuacion1 ))             AS Val_Dist_Mes, 
       Sum(flag)                                 AS Val_Dist_Mes_Nuevas, 
       Sum(Sum(flag)) 
         OVER ( 
           partition BY AÑO 
           ORDER BY mn rows UNBOUNDED PRECEDING) AS Val_Dist_Acum 
FROM   (SELECT valuacion1, 
               Extract(month FROM fecha_captura) AS mn, 
               Extract(year FROM fecha_captura)  AS AÑO, 
               CASE -- find the first year when a customer placed an order 
                 WHEN Extract(month FROM fecha_captura) = Min ( 
                      Extract(month FROM fecha_captura)) 
                      OVER ( 
                        partition BY valuacion1, Extract(year 
                      FROM fecha_captura)) THEN 1 
                 ELSE 0 
               END                               AS flag 
        FROM   table2 
        GROUP  BY fecha_captura, 
                  valuacion1) AS dt 
GROUP  BY mn, 
          AÑO 

【讨论】:

  • 感谢 VR46,我进行了更改,我正在为分区指令而苦苦挣扎,也许您也可以帮助我。我希望每年计算 VALUACION1 上的不同计数并在下一年重新设置,似乎如果发现一个值,无论年份如何,它都不会在下一年计算。我期待这个结果。例如,在 1996 年第 4 个月值 12352 没有被计算在内,因为它出现在 1997 年第 3 个月。1997 年第 4 个月 12345 也是如此,因为它在 1996 年第 2 个月被计算在内,所以没有被考虑。
  • 我已经用上面的修改和预期的结果编辑了查询。
  • 你能帮我解决这个问题吗?
  • @JSuarez - 抱歉我忘了这对你现在肯定有帮助:)
猜你喜欢
  • 2015-12-08
  • 2018-09-01
  • 1970-01-01
  • 2020-12-25
  • 2021-12-22
  • 1970-01-01
  • 2021-10-11
  • 2020-10-21
  • 1970-01-01
相关资源
最近更新 更多