SQL仅从计算字段中选择日期的最后一个条目

问题描述 投票:1回答:3

嘿,我试图将过去30天的趋势可视化为配置数据库中的折线图,因此必须以正确的方式查询数据。

表看起来像这样:

    DATE                          SCORE
September 7, 2019, 12:00 AM         3
September 7, 2019, 12:00 AM         4
September 8, 2019, 12:00 AM         9
September 9, 2019, 12:00 AM         10

我尝试了此查询,该查询计算了最后30行的NPS和滚动总和。

select DATE, 
        CASE
            WHEN SCORE <= 6 THEN '-1'
            WHEN SCORE <= 8 THEN '0'
            WHEN SCORE > 8 THEN '1'
        END AS NPS
        ,SUM(NPS) OVER(ORDER BY DATE ROWS BETWEEN 30 PRECEDING AND CURRENT ROW) AS NPSTotal
FROM Table;

看起来像这样

    DATE                          NPS    NPSTotal
September 7, 2019, 12:00 AM         -1    -1
September 7, 2019, 12:00 AM         -1    -2
September 8, 2019, 12:00 AM         1     -1
September 9, 2019, 12:00 AM         1      0

但是,如果要在配置数据库中绘制结果并将日期放在x轴上,它自然会合计NPSTotal,在9月7日给我的是-3,而不是-2。我认为查询的结果应如下所示。

    DATE                        NPSTotal
September 7, 2019, 12:00 AM       -2
September 8, 2019, 12:00 AM       -1
September 9, 2019, 12:00 AM        0 

所以我需要两件事:1.将列日期之内的NPS与过去30天而非行中的所有投票的总和相加。2.每个日期的输出应仅给出一个NPSTotal条目,该条目应为最后一个值。

如果有人对此有解决方案,将感到高兴。

sql snowflake-data-warehouse
3个回答
0
投票

如果您希望每个日期一行,请使用汇总。似乎是:

SELECT DATE, MIN(NPSTotal) as NPSTotal
FROM (SELECT DATE, 
             (CASE WHEN SCORE <= 6 THEN '-1'
                   WHEN SCORE <= 8 THEN '0'
                   WHEN SCORE > 8 THEN '1'
              END) AS NPS,
             SUM(NPS) OVER (ORDER BY DATE ROWS BETWEEN 30 PRECEDING AND CURRENT ROW) AS NPSTotal
     FROM Table
    ) t
GROUP BY DATE;

尚不清楚如何解决数据中的联系。这使用MIN()


0
投票

这是我们按日期计算nps和存储桶的方式。我假设NPS是发起人净得分。我倾向于一次性计算总体NPS,然后绘制实际值而不是相对的每日值,因为它还取决于响应的人数。如果您在第1天有一个响应者,在第2天有100个响应者,则第1天的单个响应者会使NPS倾斜。

select date(scored_at),
       ((sum(if(score>8,1,0))/count(*))-(sum(if(score<7,1,0))/count(*)))*100 as nps
from nps_scores
where score is not null
and [date comparators can go here]
group by date(scored_At)
;

0
投票

这是我在Mode中使用的代码,用于显示许多窗口大小的NPS,最后一次显示,但也仅显示窗口开始于我们开始收集数据的时间点之后的窗口。

WITH scores AS (
  SELECT score, date_Created::date AS date
  FROM db_name.nps.survey_answers
), days AS (
    SELECT column1 AS days FROM (values (1),(14),(35),(91),(105))
), wins_end AS (
    SELECT dateadd('day',-SEQ8(),current_date) AS win_date_end
    FROM table(generator(rowcount => 365*2.5))
), wins AS (
    SELECT d.days
        ,w.win_date_end
        ,dateadd('day',-d.days, w.win_date_end) AS win_date_start
    FROM days AS d
    JOIN wins_end AS w
)
SELECT w.days::text AS days
    ,w.win_date_end
    ,w.win_date_start
    ,AVG(score) AS a_score
    ,SUM(iff(score > 8,1,0)) AS promoter
    ,SUM(iff(score = 7 or score = 8,1,0)) AS pASsive
    ,SUM(iff(score < 7,1,0)) AS detractor
    ,COUNT(*) AS total
    ,ROUND((100*promoter/total)-(100*detractor/total),1) AS nps  
FROM scores AS s
JOIN wins w ON s.date >= w.win_date_start AND s.date <= w.win_date_end
GROUP BY 1,2,3
HAVING win_date_start >= '2017-06-01'

[这给出了过去2.5年中每个窗口大小的滑动窗口开始/结束(可以简化),并根据数据集计算窗口的NPS。

© www.soinside.com 2019 - 2024. All rights reserved.