我的数据结构如下:
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_2
和id_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_2
和id_1
相关联的不同/唯一cost
的数量,calc
只是cost/distinct
。
我确定这涉及到某种分区功能,但到目前为止我尝试的所有功能都无法使用。
答案 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