Sv: Not counting duplicates of declared pratition in OVER()-clause

Andreas Joseph Krogh <[email protected]>
Newsgroups gmane.comp.db.postgresql.sql
Message-ID <VisenaEmail.e2.91a23a9fffcf3cd3.16003ca4629@tc7-visena>
På tirsdag 28. november 2017 kl. 18:54:47, skrev Andreas Joseph Krogh <
[email protected] <mailto:[email protected]>>:
Hi.
 
I'm trying to prevent duplicate values from being part of SUM().
 
(complete schema with INSERTs below)
 
I have this query to count all log-entries per activity per month in a 
sub-query, then adding a value from another table in the outer query, which I'd 
then like to sum but only count values from the same month once:
 
SELECT info.*, stuff.value + info.total_for_month AS new_value , SUM
(stuff.value +info.total_for_month) OVER () AS total_new_value_sum FROM ( 
SELECT DISTINCT date_trunc('month', log.start_date::TIMESTAMP WITHOUT TIME ZONE)
AS month , log.activity_id , count(log.entity_id) OVER(partition by date_trunc(
'month', log.start_date::TIMESTAMP WITHOUT TIME ZONE), log.activity_id) AS 
num_logs_per_activity ,count(log.entity_id) OVER (partition by date_trunc(
'month', log.start_date::TIMESTAMP WITHOUT TIME ZONE)) AS total_for_month FROM 
log_entrylog  ORDER BY date_trunc('month', log.start_date::TIMESTAMP WITHOUT 
TIME ZONE) ASC, log.activity_id ASC ) AS info  LEFT OUTER JOIN stuff ON info
.month = stuff.month ; 

 
It seems I forgot to turn my brain on, sorry.
 
This query gives me what I want (using row_number() and an outer query with 
FILTER on rownum=1):
 
SELECT q.* , SUM(q.new_value) FILTER (WHERE q.rownum = 1) OVER() AS 
total_new_value_sumFROM ( SELECT info.*, stuff.value + info.total_for_month AS 
new_value ,row_number() OVER (partition by info.month) as rownum FROM ( SELECT 
DISTINCT date_trunc('month', log.start_date::TIMESTAMP WITHOUT TIME ZONE) AS 
month , log.activity_id , count(log.entity_id) OVER(partition by date_trunc(
'month', log.start_date::TIMESTAMP WITHOUT TIME ZONE), log.activity_id) AS 
num_logs_per_activity ,count(log.entity_id) OVER (partition by date_trunc(
'month', log.start_date::TIMESTAMP WITHOUT TIME ZONE)) AS total_for_month FROM 
log_entrylog  ORDER BY date_trunc('month', log.start_date::TIMESTAMP WITHOUT 
TIME ZONE) ASC, log.activity_id ASC ) AS info  LEFT OUTER JOIN stuff ON info
.month = stuff.month ) q ; 
 
Gives:
month activity_id num_logs_per_activity total_for_month new_value rownum 
total_new_value_sum 2017-01-01 00:00:00.000000 1 4 8 30 1 141 2017-01-01 
00:00:00.000000 2 4 8 30 2 141 2017-02-01 00:00:00.000000 1 10 12 111 1 141 
2017-02-01 00:00:00.000000 2 2 12 111 2 141 2017-03-01 00:00:00.000000 1 1 1 
NULL 1 141 
 
-- Andreas Joseph Krogh
CTO / Partner - Visena AS
Mobile: +47 909 56 963
[email protected] <mailto:[email protected]>
www.visena.com <https://www.visena.com>
 <https://www.visena.com>


 
(unnamed) (image/png, 1.9 KB) - not displayed
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.