Comment au sujet de cette requête avec les données publiques:
SELECT
a.day, first_day, return_next_day,
integer((return_next_day/first_day) * 100) percent
FROM (
SELECT COUNT(DISTINCT actor, 50000) first_day,
STRFTIME_UTC_USEC(
UTC_USEC_TO_DAY(PARSE_UTC_USEC(created_at)), "%Y-%m-%d") day,
FROM
[publicdata:samples.github_timeline]
GROUP BY day) a
JOIN (
SELECT
COUNT(*) return_next_day, day
FROM (
SELECT
a.day day, a.actor, b.day, b.actor
FROM (
SELECT
STRFTIME_UTC_USEC(
UTC_USEC_TO_DAY(PARSE_UTC_USEC(created_at)), "%Y-%m-%d") day,
MAX(STRFTIME_UTC_USEC(86400000000 + UTC_USEC_TO_DAY(
PARSE_UTC_USEC(created_at)), "%Y-%m-%d")) dayplus,
actor
FROM
[publicdata:samples.github_timeline]
GROUP EACH BY actor, day) a
JOIN EACH (
SELECT
STRFTIME_UTC_USEC(
UTC_USEC_TO_DAY(PARSE_UTC_USEC(created_at)), "%Y-%m-%d") day,
actor
FROM
[publicdata:samples.github_timeline]
GROUP EACH BY actor, day) b
ON a.actor = b.actor
AND a.dayplus = b.day
)
GROUP BY day) b
ON a.day = b.day
Cela me donne les résultats souhaités:
Notez la requête utilise STRFTIME_UTC_USEC(UTC_USEC_TO_DAY(PARSE_UTC_USEC(created_at)), "%Y-%m-%d") day
à plusieurs reprises, pour convertir les données de chaîne de source Un rendez-vous. Si je possédais les données, j'exécuterais au préalable un ETL sur la table, pour passer cette étape répétitive.
La requête: 2 tables joint
compte Première table combien de différents 'acteurs' lorsqu'ils sont présents dans une date précise. Notez le deuxième paramètre sur COUNT DISTINCT, pour que le compte soit précis.
Deuxième table REJOINT un jour donné avec le jour suivant, étant donné que le même acteur est présent dans les deux jours. Ensuite, vous pouvez compter le nombre d'acteurs présents dans un jour donné et le jour suivant.
En rejoignant les deux tables vous obtenez les deux comptes, et vous pouvez procéder à la division.
Il existe d'autres façons, ce n'est qu'une des nombreuses approches. Il est également possible d'optimiser cette requête encore plus loin.