2015-12-14 23 views
7

Belirli bir A/B testi kombinasyonu için her gün ziyaret sayısını ve dönüşüm sayısını almaya çalışıyorum. Her kombinasyon bir A/B testinin farklı bir varyasyonunu temsil eder. Burada varyasyonları temsil etmek için sadece '1' ve '2' kullanıyorum, ancak teknik olarak daha fazla varyasyon olabilir.2 SQL sorgusunu nasıl birleştirebilirim ve kümülatif sayımı nasıl alabilirim?

Bağımsız olarak çalışan aşağıdaki 2 sorguyu yazdım. Bunları birleştirmek veya istediğim verileri alan tek bir sorgu yazmak mümkün mü?

ziyaret sorgusu:

SELECT DATE(visit.created), visit.combination, COUNT(visit.id) 
FROM visit 
WHERE visit.user_id = 6 
AND visit.experiment_id = 1 
GROUP BY DATE(visit.created), visit.combination 

ziyaretler sonucu:

enter image description here

dönüşüm sorgusu:

SELECT DATE(conversion.created), conversion.combination, COUNT(conversion.id) 
FROM conversion 
WHERE conversion.user_id = 6 
AND conversion.experiment_id = 1 
AND conversion.goal_id = 1 
GROUP BY DATE(conversion.created), conversion.combination 

dönüşüm sonucu:

Ayrıca, aşağıdaki gibi çalışan bir toplam (birikimli) sayımı elde edebilmem, son 2 sütunu görmek harika olurdu.

+---------------+-------------+----------------------+-----------------+--------------+--------------+ 
| DATE(created) | combination | COUNT(conversion.id) | COUNT(visit.id) | cumulative_c | cumulative_v | 
+---------------+-------------+----------------------+-----------------+--------------+--------------+ 
| 2015-11-17 | 1   |     1 |    3 |   1 |   3 | 
| 2015-11-18 | 1   |     7 |    4 |   8 |   7 | 
| 2015-11-19 | 1   |     3 |    8 |   11 |   15 | 
| 2015-11-17 | 2   |     4 |    1 |   4 |   1 | 
| 2015-11-18 | 2   |     2 |    6 |   6 |   7 | 
| 2015-11-19 | 2   |     9 |    6 |   15 |   13 | 
+---------------+-------------+----------------------+-----------------+--------------+--------------+ 

veritabanı şeması:

enter image description here

cevap

4

birleştiren oldukça basittir: Yeniden ardından grup UNION_ALL yapmak ve toplamı 0 değerli sütunlarını ekleyin.

SELECT dt, combination, SUM(v_count) as v_count, SUM(c_count) as c_count 
FROM 
(
SELECT DATE(visit.created) as dt, visit.combination as combination, COUNT(visit.id) as v_count, 0 as c_count 
FROM visit 
WHERE visit.user_id = 6 
AND visit.experiment_id = 1 
GROUP BY DATE(visit.created), visit.combination 

UNION ALL 

SELECT DATE(conversion.created) as dt, conversion.combination as combination, 0 as v_count, COUNT(conversion.id) as c_count 
FROM conversion 
WHERE conversion.user_id = 6 
AND conversion.experiment_id = 1 
AND conversion.goal_id = 1 
GROUP BY DATE(conversion.created), conversion.combination 
) as t 
GROUP BY dt, combination 

Şimdi toplam koşmak için. Daha gelişmiş DBMS'de buna "pencere" veya "analitik" fonksiyonlar denir. Yukarıdaki sorgu için

SELECT dt, combination, SUM(v_count) OVER (PARTITION BY combination ORDER BY dt) as v_cumulative 

ve yalnızca istediğiniz ne verecekti: Örneğin, Oracle'da bunu yapabilirsiniz. Ancak, MySQL'in böyle işlevleri yoktur. Örneğin, here ve here tarif edilen yollar vardır, ancak oldukça zordur.

+0

Çok teşekkürler Timekiller :) Bu çalışır ve PHP'de koşu toplamı yapıyorum. Denedim ama MySQL'te her kombinasyon için çalışan toplamları yapmak için önemsiz görünmüyor, ancak bağlantılar için teşekkürler. – mattvick

0

ben bu yardımcı olacağını umut kümülatif sayımları anlamak kolaydır bu yüzden kombinasyonu ile aşağıdaki tabloya gruplandırdıysanız.

SELECT DATE(v.created), v.combination ,DATE(c.created), c.combination, COUNT(v.id), COUNT(c.id) FROM user u 
LEFT JOIN conversion c ON u.id = c.user_id 
LEFT JOIN visit v ON u.id = v.user_id 
WHERE c.id = 6 AND v.experiment_id = 1 AND c.goal_id = 1 
GROUP BY DATE(v.created), v.combination, DATE(c.created), c.combination 
+0

Lütfen cevabınıza bir açıklama. – DanFromGermany

İlgili konular