Aujourd'hui, je n'aurai jamais d'intervieweurs à des "questions" dans l'entretien "Comment compter le nombre de cartes", bien sûr, la carte interne peut être remplacée par un oignon que VI est différent, tel qu'un atterrissage continu , Journées scolaires continues, date d'achat continue, le nombre de jours ici peut être remplacé par le temps ou d'autres unités de temps. La logique de ce problème est toujours un peu compliquée. Si ce problème n'est pas rencontré avant, il s'agira certainement d'un visage.
Live, il y a un tableau T, cette table stocke chaque carte quotidienne de chaque employé, nécessite actuellement des exigences statistiques, le nombre de cartes consécutives actuelles de chaque employé, la table T est affichée dans le tableau ci-dessous. :
UID Dans le tableau ci-dessus est l'ID utilisateur, Tdate est la date, IS_FLAG est une enregistrement de l'appel de l'utilisateur, 1 est une carte, 0 n'est pas une carte.
Le résultat que nous espérons:
Pour une autre idée:
]
Utilisation du code ci-dessus, vous pouvez obtenir le résultat suivant:
select uid ,tdate ,row_number() over(partition by uid order by tdate) date_rankfrom twhere is_flag=1
select uid ,tdate ,date_rank ,(date_format(tdate,"%e") - date_rank) as day_chafrom ( select uid ,tdate ,row_number() over(partition by uid order by tdate) date_rank from demo.newtable where is_flag=1 )t1
.
Ensuite, obtenez la différence entre la journée et la date de sa carte (date_rank) à chaque date de la carte (date_rank), telle que la Journée de la carte 2020/2/3 de l'UID = 1 nombre égal à 1 et code de déploiementComme suit:
Exécutez le code ci-dessus et obtenez enfin les résultats suivants:
En regardant les résultats de ce qui précède, vous avez vu un sens,
jour_cha du jour de la carte de manière continue
, telle que UID = 1 2020/3/3 et 2020 / 2/4 est continu et leur jour_cha est 1. Ici, si nous devons obtenir des tags de manière continue, il est facile .
la journée soudainement consiste à pervertir le nombre récent de jours de cartes consécutives ou de conformité avec le numéro de carte le plus long . un problème de diamètre légendaire. Bien que dans notre exemple, le résultat de ces deux cartes est identique, mais parfois, ils varieront, tels que l'exemple suivant:
, dans cet exemple, récemment, le nombre de jours de la carte est continuellement 2 , le plus long coup de poing continu de l'histoire est 3.select uid ,day_cha ,count(tdate) flag_daysfrom (select uid ,tdate ,date_rank ,(date_format(tdate,"%e") - date_rank) as day_chafrom ( select uid ,tdate ,row_number() over(partition by uid order by tdate) date_rank from demo.newtable where is_flag=1 )t1 )t2group by uid ,day_cha
OK, continuons de revenir au questionnaire, d'abord nous avons tout l'histoire de l'historique de chaque utilisateur , Carte Coque de Continu , code est comme suit: Exécutez le code ci-dessus pour obtenir les résultats suivants: . Pour obtenir les jours punk les plus récents, nous devons simplement mettre le plus grand de la valeur de la liste de jours_cha correspondant Pour flag_days peut être supprimé; Pour obtenir un nombre à long terme d'historique de la carte, nous devons juste prendre la valeur maximale de Flag_day dans le tableau ci-dessus. Ce ne sont que quelques requêtes directes. Les exigences similaires peuvent également avoir accès aux numéros de balises antérieures supérieures à une certaine valeur, il suffit de filtrer Flag_day dans le tableau pour atteindre l'objectif. Tant que vous pouvez créer tous les cas de toutes les balises consécutives de l'historique ci-dessus, la plupart des besoins liés au poinçon continu peuvent être pris par la table ci-dessus. Une question très classique, ou une scène d'entreprise, tout le monde pratiqué.