2017-11-07 11 views
1

日付ごと、同じ日付と値のように、このSQL - 合計は、私が見えるのデータセットを持って

Enc_ID | date | P1 | P3 | 
-------------------------------- 
1  | 11/1/17 | 1 | NULL | 
2  | 11/1/17 | NULL | 1 | 
3  | 11/1/17 | 1 | NULL | 
4  | 11/2/17 | 1 | NULL | 
5  | 11/2/17 | NULL | 1 | 

すなわち、各行は出会いで、任意の日に複数の出会いがあることができます(常に) 。

P1とP3の合計を毎日計算する必要があります。だから、:

date | sum_p1 | sum_p3 | 
--------------------------- 
11/1/17 | 2 | 1 | 
11/2/17 | 3 | 2 | 

は、それから私は、このような各日付のこれらの合計ごとにこの計算を実行する必要があります。

(sum_p1 - sum_p3)/sum_p1 

だから私は最終的に

date | dropout rate 
---------------------- 
11/1/17 | 50% 
11/2/17 | 33% 

を示すであろうテーブルを必要としますスーパーセットでこれをやろうとしているので、JOINSは使用できません。私はGROUP BY入れ子のいくつかの種類を試みたが、MySQL (5.7.20)それを好まない。

これは私の現在のクエリですが、それぞれの日付ではなく、各日付に対してp1とp3のSUMを返します。

SELECT encounter_date AS __timestamp, 
     (SUM(p1) - SUM(p3))/SUM(p1) AS pd 
FROM encounter 
WHERE encounter_date >= '2016-11-06 00:00:00.000000' 
    AND encounter_date <= '2017-11-06 17:00:29.000000' 
GROUP BY encounter_date 
ORDER BY encounter_date ASC 
LIMIT 50000 
OFFSET 0 
+0

ですか? –

+0

助けを書いて@Gordonに感謝します:) –

+0

@ClodoaldoNeto現在私はMySQLで働いていますが、私たちはすぐにPostgresに切り替えると思いますので、両方ともタグを付けました –

答えて

0

MySQLでは、変数またはサブクエリを使用します。この場合、変数は簡単です。

select encounter_date, p1, p3, 
     (@p1 := @p1 + p1) as running_p1, 
     (@p3 := @p3 + p3) as running_p3 
from (select encounter_date, count(p1) as p1, count(p3) as p3 
     from encounter e 
     where encounter_date >= '2016-11-06 00:00:00.000000' and encounter_date <= '2017-11-06 17:00:29.000000' 
     group by encounter_date 
     order by encounter_date 
    ) e cross join 
    (select @p1 := 0, @p3 := 0) params; 

最後の計算では、これをサブクエリとして使用して最終計算を行います。

+0

"あなたの最終計算には、これを最終的な計算を行うサブクエリとして使用します。 (私はSQLのまったく新しいものです) ありがとう:) –

+0

@ClayCrosby。 。 。サブクエリ/派生テーブルの内容を理解する必要があります。 –

+0

2行目と3行目を素早く編集しましたが、これはうまくいきました。ありがとう@Gordon !! –

0

私は2つの接続のクエリで順次それを行うだろう:それは、MySQLやPostgreSQL

SELECT encounter_date as `date`, (1-`sum_p3`/`sum_p1`) as `dropout rate` FROM (
SELECT encounter_date, SUM(p1) as `sum_p1`, SUM(p3) as `sum_p3` 
FROM encounter 
WHERE encounter_date >= '2016-11-06 00:00:00.000000' 
    AND encounter_date <= '2017-11-06 17:00:29.000000' 
GROUP BY encounter_date 
ORDER BY encounter_date ASC 
) as `grouped` 
+0

これは、毎日**の**ではなく**毎日**の値を返します –

関連する問題