我的数据结构如下:
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_1
和cost
相关的id_2
的不同计数
所以最终的产品应该是这样的:
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_1
和cost
关联的不同/唯一的id_2
的数量,而calc
仅仅是cost/distinct
。
我确信这涉及到某种分区函数,但我到目前为止尝试的所有东西都不起作用。
发布于 2018-06-01 03:43:44
Id执行如下所示的子查询:
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
发布于 2018-06-03 18:35:04
红移和Postgres都不支持使用窗口函数的count distinct
。
但是,如果id_2
对于给定的计数是唯一的,那么我们不需要count distinct操作,因为它等同于id_1
。在示例数据中,id_1
的id_2
是唯一的
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
的distinct计数;
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
https://stackoverflow.com/questions/50631626
复制相似问题