0
votes

Sélectionnez par la longueur des caractères

Je dois sélectionner la phrase la plus longue qui a points> 0 mais être contenue dans une phrase qui a points = 0 , si vous regardez la démo que les rangées en sortie serait numéro 3 et 6:

http://sqlfiddle.com/#!18/e954f/1/0

Merci d'avance.


5 commentaires

(1) J'ai supprimé les balises de base de données incompatibles. Veuillez baliser uniquement avec la base de données que vous utilisez vraiment. (2) Un violon SQL est vraiment bon - pour augmenter les informations dans une question. Vous devez fournir des échantillons de données et des résultats souhaités dans la question .


Êtes-vous sûr qu'il est 3 et 6? La 7ème rangée a plus de caractères et de points que le 6ème.


Tomasz Kasperczyk Oui, mais la ligne 6 est contenue dans une longueur plus longue que la ligne 7, elle a une correspondance plus longue


Vous voulez la phrase la plus longue, mais vous voulez deux enregistrements en sortie. C'est impossible. Comment déterminez-vous des groupes de phrases à comparer avec et d'obtenir la plus longue pour chaque groupe?


Kamil Goscimininski Mon indication sont les rangées avec 0 points, maintenant, je dois trouver la phrase avec des points> 0 avec le plus long match contenu, je sais que je ne m'expliquerais peut-être pas le meilleur.


3 Réponses :


1
votes

Vous pouvez utiliser une join interne comparant les phrases avec un comme code> pour obtenir uniquement ceux contenus dans une autre phrase. Filtre pour le point dans un où la clause CODE>. Ensuite, obtenez le rang () code> partitionné par la phrase de l'instance jointe et commandé par la longueur décroissante. Dans un externe, sélectionnez cod> obtenez ceux avec un rang d'un. xxx pré>

SQL FIDDLE P>


EDIT: P>

Pour inclure l'autre phrase: P>

SELECT x.id,
       x.phrase,
       x.other_phrase,
       x.points
       FROM (SELECT w1.id,
                    w1.phrase,
                    w2.phrase other_phrase,
                    w1.points,
                    rank() OVER (PARTITION BY w2.phrase
                                 ORDER BY len(w1.phrase) DESC) r
                    FROM words w1
                         INNER JOIN words w2
                                    ON w2.phrase LIKE concat(w1.phrase, '%')
                    WHERE w2.points = 0
                          AND w1.points > 0) x
       WHERE x.r = 1;


5 commentaires

Je passe tellement de temps à travailler avec MySQL 5.x, j'oublie la plupart des supports SQL Classement . Merci de me le rappeler.


Merci pour votre bit collant de réponse


J'utilise cette solution s'il manque une colonne de la phrase correspondante avec les 0 points, comment pourrais-je ajouter une telle colonne? Merci pour votre aide SQLFIDDLE.com/#118/24F134/4/0


@ Réfaelo1979: Ajoutez-le simplement à la liste. Voir la modification.


@sticky bit je suis reconnaissant



0
votes

Vous recevrez de la longueur maximale à min de phrase où points> 0 xxx

et si vous voulez la phrase la plus longue xxx


0 commentaires

1
votes

Vous pouvez utiliser un CTE pour trouver toutes les phrases avec des points positifs qui sont une sous-chaîne d'une phrase avec 0 points. Ensuite, vous pouvez trouver la longueur maximale des substrings associées à chaque phrase 0 point et rejoindre code> qui retourne sur le CTE pour obtenir la phrase qui correspond à cette condition:

id  phrase              points
3   tool box online     1
6   stone road          1


1 commentaires

Nick très apprécié