Vu le tableau suivant:Trouver des lignes adjacentes sans procédure stockée
someId INTEGER #PK
ageStart TINYINT(3)
ageEnd TINYINT(3)
dateBegin INTEGER
dateEnd INTEGER
Où dateBegin
et dateEnd
sont les dates représentées comme jours depuis 1800-12-28
...
Et considérant certaines données de l'échantillon:
someId | ageStart | ageEnd | dateStart | dateEnd
------------------------------------------------
203 | 16 | 25 | 76533 | 76539 \
506 | 16 | 25 | 76540 | 76546 adjacent rows
384 | 16 | 25 | 76547 | 76553 /
342 | 16 | 25 | 76563 | 76569 \
545 | 16 | 25 | 76570 | 76576 adjacent rows
764 | 16 | 25 | 76577 | 76583 /
(Il y aurait des lignes arbitraires mélangées bien sûr, je veux juste illustrer 2 ensembles de lignes pertinents)
Est-il possible de trouver des lignes adjacentes pour une catégorie d'âge donnée (ageStart à ageEnd) sans procédure stockée? Le critère d'adjacence est: dateStart
est 1 jour après dateEnd
de la ligne précédente trouvée.
Par exemple, étant donné que les données ci-dessus de l'échantillon, si je devais l'interroger avec les paramètres suivants:
ageStart = 16
ageEnd = 25
dateStart = 76533
Je voudrais qu'il me retourner les lignes 1, 2 et 3 des données d'échantillons, puisque leurs dates sont adjacentes (dayStart est le jour suivant du dateEnd de la ligne précédente).
ageStart = 16
ageEnd = 25
dateStart = 76563
... me donner des lignes 4, 5 et 6 des données d'échantillon
Saint moly! Ce n'est pas une question de jeu d'enfant. C'est briljant sanglant! Il me faudra probablement une bonne heure pour comprendre complètement ce qui se passe exactement dans la requête, mais il semble que ce soit le retour des données dont j'ai besoin. En passant: les données de la table sont acceptables pour cette requête je crois. Il y a environ 2000 lignes maximum à un moment donné dans la table, donc cela ne devrait pas poser de problème. Requête géniale. Je vous remercie. –
La première requête (init) est juste pour initialiser la variable utilisateur @continue à 2. La seconde (a) est pour s'assurer qu'il y a au moins une ligne pour votre condition, la troisième (b) pour obtenir toutes les données triées et à partir de startDate demandé, la jointure à gauche (c) s'assure que la dernière ligne ne vérifie pas la condition sera return mais avec des valeurs nulles. Le cas est là pour arrêter la requête retourne la ligne après la dernière ligne adjacente est trouvée. Vous pouvez voir ce qui se passe en supprimant le cas where, et en faisant un select a. *, B. *, C. *;) – Patrick
Merci d'avoir clarifié la requête. Cette requête m'a donné beaucoup de nouvelles astuces pour jouer avec. Surtout l'initialisation de la variable. Je me suis toujours demandé comment utiliser les variables dans des requêtes non SP, mais je n'ai jamais cherché à l'étudier. Si je pouvais vous donner plus de votes, je le ferais. Merci encore Patrick. –