嘿,我试图将过去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条目,该条目应为最后一个值。
如果有人对此有解决方案,将感到高兴。
如果您希望每个日期一行,请使用汇总。似乎是:
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()
。
这是我们按日期计算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)
;
这是我在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。