我怎么能做一个明确的总和?

时间:2015-08-17 23:13:07

标签: sql postgresql amazon-redshift

我正在尝试创建一个“得分”统计量,该值来自某列的值,计算为案例表达式的总和。不幸的是,查询结构需要是一个完整的外连接(这从实际查询中简化,并且连接结构从原始代码中幸存下来),因此总和不正确,因为每行可能多次出现。我可以用独特的键分组;但是,它会破坏同一查询中的其他聚合函数。

我真正想要做的是总和(当不同的claim_id时的情况)当然不存在;有没有办法可以满足我的需要?或者这必须是两个查询吗?

如果重要的话,这是红色的。

create table t1 (id int, proc_date date, claim_id int, proc_code char(1));
create table t2 (id int, diag_date date, claim_id int);

insert into t1 (id, proc_date, claim_id, proc_code)
values (1, '2012-01-01', 0, 'a'),
(2, '2009-02-01', 1, 'b'),
(2, '2019-02-01', 2, 'c'),
(2, '2029-02-01', 3, 'd'),
(3, '2016-04-02', 4, 'e'),
(4, '2005-01-03', 5, 'f'),
(5, '2008-02-03', 6, 'g');

insert into t2 (id, diag_date, claim_id)
values (4, '2004-01-01', 20),
(5, '2010-02-01', 21),
(6, '2007-04-02', 22),
(5, '2011-02-01', 23),
(6, '2008-04-02', 24),
(5, '2012-02-01', 25),
(6, '2009-04-02', 26),
(7, '2002-01-03', 27),
(8, '2001-02-03', 28);

select id, sum(case when proc_code='a' then 5
         when proc_code='b' then 10
         when proc_code='c' then 15
         when proc_code='d' then 20
         when proc_code='e' then 25
         when proc_code='f' then 30
         when proc_code='g' then 35 end), count(distinct t1.claim_id) as proc_count, min(proc_date) as min_proc_date

from t1 full outer join t2 using (id) group by id order by id;

2 个答案:

答案 0 :(得分:2)

您可以将条件聚合分成cte或子查询,并使用OVER(PARTITION BY id)获取id级聚合而不进行分组,如下所示:

with cte AS (SELECT *,sum(case when proc_code='a' then 5
                               when proc_code='b' then 10
                               when proc_code='c' then 15
                               when proc_code='d' then 20
                               when proc_code='e' then 25
                               when proc_code='f' then 30
                               when proc_code='g' then 35 end) OVER(PARTITION BY id) AS Some_Sum                  
                  , min(proc_date) OVER(PARTITION BY id) as min_proc_date
             FROM t1
             )
select id
     , Some_Sum
     , count(distinct cte.claim_id) as proc_count
     , min_proc_date
from cte 
full outer join t2 using (id) 
group by id,Some_Sum,min_proc_Date 
order by id;

演示:SQL Fiddle

请注意,您必须将这些汇总添加到外部查询中的GROUP BY,并且PARTITION BY中的字段应与之前在t1字段中使用的GROUP BY字段相匹配id,在这种情况下仅为t1,但如果您的完整查询在GROUP BY中有其他PARTITION BY字段,请务必将其添加到<form id="form" name="form" method="post" action="step8.php" role="form"> <div class="form-group"> <?php for($i=0;$i<transponum;$i++){ ?> <label class="control-label" for="exampleInputEmail1">Name</label>"; <input style="width: 60%;" type="text" class="form-control" id="transponum" name="transponame<?php echo $i;?>" placeholder="Name"> <label class="control-label" for="exampleInputEmail1">ID</label> <input style="width: 60%;" type="text" class="form-control" id="transponumLabel" name="transpoid<?php echo $i;?>" placeholder="Name"><hr> <?php } ?> </div> <button type="submit" class="btn-success btn" name="submit">Next</button> </form>

答案 1 :(得分:0)

您可以使用子查询(通过id和id_claim)然后重新组合:

with base as (
select id, avg(case when proc_code='a' then 5
         when proc_code='b' then 10
         when proc_code='c' then 15
         when proc_code='d' then 20
         when proc_code='e' then 25
         when proc_code='f' then 30
         when proc_code='g' then 35 end) as value_proc, 
         t1.claim_id , min(proc_date) as min_proc_date
  from t1 full outer join t2 using (id) group by id, t1.claim_id order by id, t1.claim_id) 
 select id, sum(value_proc), count(distinct claim_id) as proc_count,  min(min_proc_date) as min_proc_date
   from base
   group by id
   order by id;

请参阅我为内部子查询提取avg,但如果您确定相同的claim_id具有相同的字母,则可以使用maxmin,这是整数。如果不是喜欢这个。