Разные результаты при различном подсчете за разные периоды времени
Я пытаюсь получить количество уникальных посетителей. Сначала я проверил его по общему количеству, не разделяя его в любое время.
Основная таблица (образец таблицы больших данных):
+-----------+----+-------+
|theDateTime|vD | vis |
+----------------+-------+
|2018-10-03 |123 |abc |
|2018-10-04 |123 |abc |
|2018-10-04 |123 |pqr |
|2018-10-05 |123 |xyz |
+-----------+----+-------+
общий отчетливый счет выше будет 3, но когда я группирую по дням abc
считается дважды. Сначала 3-го, а затем 2-го. Я просто хочу, чтобы первый посчитал.
Мой запрос для всего:
select
d.eId AS vD
, COUNT(DISTINCT visitorId) AS vis
from decisions
WHERE d.eId = 123
AND timestamp BETWEEN unix_timestamp('2018-10-03 00:00:00')*1000 AND
unix_timestamp('2018-10-06 12:17:00')*1000
GROUP BY d.eId
ORDER BY vId
Мои результаты:
+----+---------+
| vD | vis |
+----+---------+
|123 | 3 |
+----+---------+
Мой запрос по дням:
select DISTINCT
cast(from_unixtime(timestamp DIV 1000) AS date) AS theDateTime
, d.eId AS vD
, COUNT(DISTINCT visitorId) AS vis
from decisions
WHERE timestamp BETWEEN unix_timestamp('2018-10-03 00:00:00')*1000 AND
unix_timestamp('2018-10-06 12:17:00')*1000
AND d.eId IN (11550123588)
GROUP BY cast(from_unixtime(timestamp DIV 1000) AS date),
d.vD
ORDER BY vD, theDateTime
Мои результаты:
+-----------+----+-------+
|theDateTime|vD | vis |
+----------------+-------+
|2018-10-03 |123 | 1 |
|2018-10-04 |123 | 2 |
|2018-10-05 |123 | 1 |
+-----------+----+-------+
Всего это 1122585. Что больше, чем общая сумма
Я знаю, что это потому, что посетитель просто повторяется в другой день, и когда я группирую его по дням, он учитывается дважды. Можно ли как-то подсчитать посетителя на 2-й день, если он уже был учтен на 1-й день?
Пожалуйста помоги!
2 ответа
Если я правильно понимаю, вы можете сделать это в SQL с помощью подзапроса:
select min_dt, count(distinct visitorId) AS vis
from (select eid, vis, min(thedatetime) as min_dt
from decisions d
where d.eid = 123 and . . .
group by vis, eid
) d
group by min_dt
Если я правильно понял, вам просто нужно другое представление данных.
val df = Seq(("2018-10-03",123,"abc"),
("2018-10-04",123,"abc"),
("2018-10-05",123,"pqr"),
("2018-10-06",123,"xyz")).toDF("theDateTime","vD","vis").withColumn("theDateTime", $"theDateTime".cast("timestamp"));
df.show
import org.apache.spark.sql.functions._
val df1 = df.groupBy("vis").pivot("vD").agg(min("theDateTime")).sort($"123")
df1.show
+---+-------------------+
|vis| 123|
+---+-------------------+
|abc|2018-10-03 00:00:00|
|pqr|2018-10-05 00:00:00|
|xyz|2018-10-06 00:00:00|
+---+-------------------+
Теперь, если вы сгруппируете по "123", вы сможете получить уникальный счет в день. Это помогает?