创建一个计算不同项目的分区

时间:2018-05-31 19:39:00

标签: sql postgresql amazon-redshift

我的数据结构如下:

id_1    id_2    cost
85358   138544  60
85358   210261  60
85358   121693  60
85358   210264  60
85358   156498  60
85358   210272  60
85358   210275  60
85358   154615  60
85358   171304  60
85358   138547  60
85358   171304  150
85358   210272  150
85358   156498  150
85358   210264  150
85358   138547  150
85358   138544  150
85358   210275  150
85358   121693  150
85358   210261  150
85358   154615  150
85358   138544  155
85358   210264  155
85358   210261  155
85358   121693  155
85358   210275  155
85358   154615  155
85358   210272  155
85358   171304  155
85358   156498  155
85358   138547  155

我希望完成的是创建一个新列,该列分隔与每个id_2id_1

相关联的cost的非凡数量

所以最终产品看起来像这样:

id_1    id_2    cost distinct calc
85358   138544  60   10       6.00
85358   210261  60   10       6.00
85358   121693  60   10       6.00
85358   210264  60   10       6.00
85358   156498  60   10       6.00
85358   210272  60   10       6.00
85358   210275  60   10       6.00
85358   154615  60   10       6.00
85358   171304  60   10       6.00
85358   138547  60   10       6.00
85358   171304  150  10       15.00
85358   210272  150  10       15.00
85358   156498  150  10       15.00
85358   210264  150  10       15.00
85358   138547  150  10       15.00
85358   138544  150  10       15.00
85358   210275  150  10       15.00
85358   121693  150  10       15.00
85358   210261  150  10       15.00
85358   154615  150  10       15.00
85358   138544  155  11       14.09
85358   210264  155  11       14.09
85358   210261  155  11       14.09
85358   121693  155  11       14.09
85358   210275  155  11       14.09
85358   154615  155  11       14.09
85358   210272  155  11       14.09
85358   171304  155  11       14.09
85358   156498  155  11       14.09
85358   138547  155  11       14.09
85358   222431  155  11       14.09

所以是的,distinct表示与id_2id_1相关联的不同/唯一cost的数量,calc只是cost/distinct

我确定这涉及到某种分区功能,但到目前为止我尝试的所有功能都无法使用。

2 个答案:

答案 0 :(得分:0)

我执行这样的子查询:

select a.*, cnt, a.cost/cast(cnt as float) from yourtable a 
join (
select id_1,  cost, count(distinct id_2) cnt
from yourtable
group by id_1,  cost)b
on a.id_1=b.id_1 and a.cost=b.cost

答案 1 :(得分:0)

Redshift和Postgres都不支持count distinct窗函数。

但是,如果id_2对于给定的id_1是唯一的,那么我们就不需要计数不同的操作,因为它等同于count。在您的示例数据id_2

中,id_1是唯一的
SELECT
t.*, COUNT(*) OVER (PARTITION BY t.id_1) distinct_count,
(t.cost / COUNT(*) OVER (PARTITION BY t.id_1)) :: REAL calc
FROM thetable t

否则,在子查询和连接中按id_1聚合不同的计数;

SELECT t.*, t2.count_2, (t.cost / t2.count_2) :: REAL calc

FROM thetable t
JOIN (SELECT id_1, COUNT(DISTINCT id_2) count_2 FROM thetable GROUP BY 1) t2
  ON t2.id_1 = t.id_1