psql提取每周计数和占总数的百分比

psql提取每周计数和占总数的百分比,psql,Psql,我试图从我们的db表中提取与“G”G GARGER G-R类型相匹配的特定类型研究的频率,以及该周的研究总数与“G”的所有类型和相对频率相匹配。我想把输出分成从周一开始到周五结束的几周 我使用generate_系列来获取感兴趣期间的一系列周一 选择current_date-castextractdow from current_date as int+1-s.a as dates from generate_Series0182,7 as sa 使用以下命令 FROM (SELECT (curr

我试图从我们的db表中提取与“G”G GARGER G-R类型相匹配的特定类型研究的频率,以及该周的研究总数与“G”的所有类型和相对频率相匹配。我想把输出分成从周一开始到周五结束的几周

我使用generate_系列来获取感兴趣期间的一系列周一

选择current_date-castextractdow from current_date as int+1-s.a as dates from generate_Series0182,7 as sa

使用以下命令

FROM (SELECT (current_date- cast(extract(dow from current_date) as int) + 1) - s.a AS dates FROM generate_series(0,182,7) AS s(a)) d
    LEFT JOIN study ON
study_date <= d.dates 
WHERE study_name ~ 'T(C|L)S' and study_type ~'G'                                            
GROUP BY 1
ORDER BY 1;
这给了我一个正确的滚动计数,因为我们对“G”型进行了更多的研究。但是,我尝试将其划分为每周范围

SELECT d.dates, count(*)                                
FROM (SELECT (current_date- cast(extract(dow from current_date) as int) + 1) - s.a AS dates FROM generate_series(0,182,7) AS s(a)) d
    LEFT JOIN study ON
study_date >= d.dates  
WHERE study_name ~ 'T(C|L)S' and study_type ~ 'G' AND study_date <= myo_date + interval '5' day
GROUP BY 1
ORDER BY 1;
我如何获得每周的计数?另外,我如何在研究类型可以是任何内容的情况下添加额外的列total counts

预期产量

 dates    | count 
    ------------+-------
     26/06/2017 |    6
     03/07/2017 |    5
     10/07/2017 |    4
     17/07/2017 |    15
     24/07/2017 |    8
     31/07/2017 |    9
     07/08/2017 |    14
     14/08/2017 |    16
您可以在此处尝试使用LAG:

您可以在此处尝试使用LAG:


第二个预期输出是什么?@TimBiegeleisen本质上是第一个输出上两行之间的差异。周一至周五期间进行的研究数量,其中周一日期来自该系列generatedDone@TimBiegeleisenI不要相信粘贴在这里的任何代码都会运行。请为第一组输出包含一个功能查询。第二个预期输出是什么?@TimBiegeleisen主要是第一个输出上两行之间的差异。周一至周五期间进行的研究数量,其中周一日期来自该系列generatedDone@TimBiegeleisenI不要相信粘贴在这里的任何代码都会运行。请为您的第一组输出包括一个功能查询。这给了我错误:第1行或附近的语法错误:cte AS?psql版本相关的8.4。20@moadeep您的查询有问题。编辑我的答案并将您的实际查询放入CTE。我看不懂你的心思。这给了我一个错误:第1行或附近的语法错误:cte AS?psql版本相关的8.4。20@moadeep您的查询有问题。编辑我的答案并将您的实际查询放入CTE。我看不懂你的心思。
  dates    | count 
------------+-------
 13/02/2017 |    79
 20/02/2017 |    79
 27/02/2017 |    79
 06/03/2017 |    79
 13/03/2017 |    79
 20/03/2017 |    79
 27/03/2017 |    79
 03/04/2017 |    79
 10/04/2017 |    79
 17/04/2017 |    79
 24/04/2017 |    79
 01/05/2017 |    79
 08/05/2017 |    79
 15/05/2017 |    79
 22/05/2017 |    79
 29/05/2017 |    79
 05/06/2017 |    79
 12/06/2017 |    79
 19/06/2017 |    79
 26/06/2017 |    74
 03/07/2017 |    70
 10/07/2017 |    68
 17/07/2017 |    53
 24/07/2017 |    44
 31/07/2017 |    34
 07/08/2017 |    22
 14/08/2017 |     3
 dates    | count 
    ------------+-------
     26/06/2017 |    6
     03/07/2017 |    5
     10/07/2017 |    4
     17/07/2017 |    15
     24/07/2017 |    8
     31/07/2017 |    9
     07/08/2017 |    14
     14/08/2017 |    16
WITH cte AS (
    SELECT
        (current_date- cast(extract(dow from current_date) as int) + 1) - s.a AS dates,
    COUNT(*) AS cnt
    FROM generate_series(0,182,7) AS s(a)) d
    LEFT JOIN study
        ON study_date <= d.dates 
    WHERE study_name ~ 'T(C|L)S' and study_type ~'G'
    GROUP BY 1
)

SELECT
    dates,
    cnt - LAG(cnt, 0) OVER (ORDER BY dates)
FROM cte;