2010-08-31 10 views
1

J'ai une table avec plusieurs lignes pour chaque utilisateur. Chaque utilisateur aura le même nombre de lignes mais les identifiants de ligne sont tous différents pour chaque utilisateur, alors comment puis-je obtenir juste la Nième ligne pour un utilisateur donné?Comment puis-je obtenir uniquement la Nième ligne de données de sybase?

En supposant une commande par user_id, row_id clause afin de vous garantir une commande cohérente pour un utilisateur donné.

Ceci est sybase 12 je travaille avec ici.

+2

Les bases de données relationnelles n'ont pas le concept d'ordre natif. Demander le nième élément d'une table est une question invalide, mais vous devez toujours demander vos données avec une clause 'order by', ce que je ne pense pas être ce que vous spécifiez ici. – Cruachan

+0

Je vais mettre à jour la question ... – stu

+1

@Cruachan: c'est faux, voir ma réponse – vol7ron

Répondre

0

si vous pouvez ajouter la colonne seq_id à la table qui a démarré à 0 pour chaque ID utilisateur. Vous pouvez interroger avec cette colonne.

+0

ne peut pas modifier les données, pas une option. bonne idée cependant. – stu

+0

@stu: Pouvez-vous ajouter une autre table (avec la combinaison de user_id et row_id de votre table existante) avec un seq_id dessus? À moins que vous ne puissiez ajouter un type de données quelque part, vous n'avez pas de chance, car la conception de votre base de données est inadéquate pour ce que vous devez faire. –

+0

bien que ça craint un peu. changer ces tables (il y en a beaucoup) impliquerait de réparer beaucoup d'applications existantes, c'est pourquoi ce n'est pas vraiment une option pour mon petit projet. La seule chose que je suis venu avec était de faire un choix de sélectionner le type de chose où j'ai choisi le top 3, puis à l'extérieur de faire un top 1 avec l'ordre inversé. Extrêmement moche mais ça marchera. J'espérais quelque chose de plus simple. Il irait comme ceci: sélectionner le champ de (sélectionner le champ 1 de (sélectionner le champ 3 du tableau) ordre par champ) ordre par champ desc – stu

1

SYBASE aurait fenêtrage fonctions

SELECT * 
FROM (select row_number() over (order by user_id, row_id) as row, bar.* 
     from bar 
     ) foo 
WHERE foo.row = 7 
+0

C'est pour sybase n'importe où, pas Sybase ASE, la réponse ne s'applique pas à la question, malheureusement. Les fonctions OLAP ne sont pas prises en charge dans ASE. – bestsss

+0

Confondez-vous «sybase Anywhere» avec SQL Anywhere? les fonctions analytiques (premier lien) devraient être dans les deux; Cependant, je reconnais que ma connaissance de SYBASE est limitée. Pourtant, l'auteur n'a jamais déclaré s'il utilisait ASE ou SA – vol7ron

+0

Sybase IQ n'est pas Sybase ASE ... trucs sybase est tellement foiré, l'OP dit Sybase 12 (c'est ASE) – bestsss

3

Si vous utilisez Sybase SQL Anywhere (on ne sait pas si vous utilisez SA ou ASE) , recherchez les clauses start at et top de l'instruction selecthere. Par exemple:

select top 1 start at 7 * from mytable order by user_id, row_id 

récupérera la 7ème rangée.

+1

J'utilise ASE 15, ne pas semblent fonctionner là. – stu