Maison  >  Questions et réponses  >  le corps du texte

SQL : calcule si un identifiant apparu seulement la semaine dernière n'est pas apparu

J'essaie de faire un défilement hebdomadaire pour voir si un utilisateur a assisté ou non à un événement. Cependant, je souhaite seulement les lister comme « Non assisté » s'ils ont assisté à la semaine dernière . Par exemple, si un utilisateur a assisté aux semaines 1 et 7, il ne sera compté comme « non présent » que les semaines 2 et 8.

Exemple simplifié de données :

Tableau Événements qui comprend toutes les dates d'événements (hebdomadaires) et les identifiants d'événements uniques (heure croissante)

Date_Événement Event_ID
2023-03-09 1
2023-03-16 2
2023-03-23 3

Tableau Utilisateurs affichant les dates des événements et les identifiants auxquels ils ont participé :

Date_Événement Event_ID ID_utilisateur
2023-03-09 1 151
2023-03-16 2 151
2023-03-23 3 151
2023-03-09 1 299
2023-03-23 3 299
2023-03-16 2 373

Ma question : Comment compléter la sortie suivante en utilisant SQL ? (L'utilisateur 299 a participé à l'activité 1 mais pas à l'activité 2 ; l'utilisateur 373 a participé à l'activité 2 mais pas à l'activité 3)

Missed_Event_Date Missed_Event_ID ID_utilisateur
2023-03-16 2 299
2023-03-23 3 373

J'ai essayé d'utiliser

SELECT      Event_ID + 1,
            User_ID
FROM users u
WHERE NOT EXISTS (SELECT 1 FROM events WHERE u.Event_ID=e.Event_ID + 1)

Ne produit pas un résultat correct

P粉529581199P粉529581199384 Il y a quelques jours427

répondre à tous(1)je répondrai

  • P粉818561682

    P粉8185616822023-09-08 11:03:22

    En supposant que Event_ID augmente de 1, vous pouvez également considérer ce qui suit.

    SELECT u.Event_ID + 1 AS Missed_Event_ID, u.User_ID
      FROM users u LEFT JOIN users v 
        ON u.User_ID = v.User_ID AND u.Event_ID + 1 = v.Event_ID
     WHERE v.Event_ID IS NULL AND u.Event_ID < (SELECT MAX(Event_ID) FROM events);
    
    -- Query results
    +-----------------+---------+
    | Missed_Event_ID | User_ID |
    +-----------------+---------+
    |               2 |     299 |
    |               3 |     373 |
    +-----------------+---------+
    

    répondre
    0
  • Annulerrépondre