Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Αρίθμηση των rows ενός select command

Îåêßíçóå áðü ôï ìÝëïò gabrielk43. Τελευταία δημοσίευση από το μέλος gabrielk43 στις 23-10-2007, 14:11. Υπάρχουν 9 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  22-10-2007, 17:28 36489

    Αρίθμηση των rows ενός select command

    Γεια σε όλους. Έχω το εξής πρόβλημα: Διαθέτω ένα table (σε MS SQL Server) με χρήστες,  καθένας από τους οποίους έχει κάποιους πόντους (TotalPoints). Ενδέχεται δύο χρήστες να έχουν τους ιδιους πόντους. Θέλω, αφού τους κατατάξω με βάση τους πόντους, να μπορώ να διαλέξω όλα τα rows (τους χρήστες)  που ανήκουν σε κάποιον συγκεκριμένο range, δηλαδή για παραδειγμα απο την δεύτερη σειρα έως την δέκατη. Το κατάφερα σε SQL Server 2005 Express χρησιμοποιώντας την Row_Number() function :

    SELECT * FROM
            (SELECT Row_Number() OVER(ORDER BY TotalPoints)
            AS RowID, * FROM User) dt WHERE
            dt.RowID>1 AND dt.RowID<=10

    Όλα καλά έως εδώ. Τελικά όμως ο SQL Server που θα χρησιμοποιήσω δεν είναι 2005, είναι 2000 οπότε Row_Number function δεν υπάρχει. Προσπάθησα με άλλο τρόπο να το κάνω αλλά δεν τα κατάφερα. Οποιαδήποτε βοήθεια θα ήταν σίγουρα ευπρόσδεκτη. Ευχαριστώ.








  •  22-10-2007, 17:41 36491 σε απάντηση της 36489

    Απ: Αρίθμηση των rows ενός select command

    Σε SQL Server 2000 η ίδια λειτουργικότητα μπορεί να επιτευχθεί ως εξής: Δημιουργείς ένα table variable (ή ένα temporary table) με την ίδια δομή με αυτή του αρχικού σου table ΣΥΝ ένα identity πεδίο ακόμα. Αυτό το identity πεδίο θα υποκαταστήσει το row numbering χωρίς να παρουσιάζει τις ασυνέχειες που πιθανώς να εμφανίζει το δικό σου identity πεδίο στον πρωτότυπο πίνακα μετά από διαγραφές.

    Ετσι λοιπόν, για ένα πίνακα, π.χ. Customers, με πεδία customerName και customerSurname μπορείς να κάνεις το εξής:

    --Δημιουργούμε ένα table variable
    DECLARE @t TABLE (
    TID int identity(1,1),
    customerName varchar(100),
    customerSurname varchar(100)
    )

    --Και το γεμίζουμε με τα data από τον πρωτότυπο πίνακα.
    INSERT @t (customerName,customerSurname)
    SELECT CustomerName, CustomerSurname FROM Customers

    Και έτσι έχεις μια δομή με row numbering που ακολουθεί τον τρόπο με τον οποίο γέμισες τον προσωρινό σου πίνακα.


    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
    Δημοσίευση στην κατηγορία: , ,
  •  23-10-2007, 09:34 36498 σε απάντηση της 36491

    Απ: Αρίθμηση των rows ενός select command

    Ένας δεύτερος τρόπος είναι να χρησιμοποιήσεις το παρακάτω:

    SELECT ProductID,
           ProductName,
           UnitPrice,
           (SELECT COUNT(*)
            FROM Products p2
            WHERE p1.ProductID >= p2.ProductID
           ) AS rownumber
    FROM Products p1
    ORDER BY ProductID

    Πάντως τόσο η τεχνική με το temporary table όσο και η παραπάνω έχουν αρκετό κόστος για τον server και καλό είναι να τις χρησιμοποιήσεις μόνο αν είναι απαραίτητο.


    Vir prudens non contra ventum mingit
  •  23-10-2007, 10:26 36500 σε απάντηση της 36498

    Απ: Αρίθμηση των rows ενός select command

    Ευχαριστώ πάρα πολύ για τις απαντήσεις. Η αλήθεια είναι ότι την δεύτερη περίπτωση την είχα δοκιμάσει και είχα το εξής πρόβλημα για το οποίο αν υπάρχει κάποια λύση, θα χαρώ πολύ να την ακούσω. Σε περίπτωση που δύο users έχουν τον ίδιο αριθμό πόντων για παράδειγμα και ας πούμε ότι υπάρχουν 4 users, η αρίθμηση των σειρών δεν είναι 1,2,3,4 αλλά 1,3,3,4. Υπάρχει περίπτωση με κάποια προσθήκη μιας συνθήκης στο WHERE να διορθωθεί αυτό;

    Ευχαριστώ εκ των προτέρων.


  •  23-10-2007, 11:04 36501 σε απάντηση της 36500

    Απ: Αρίθμηση των rows ενός select command

    H δεύτερη λύση απαιτεί να υπάρχει στον πίνακα ένα primary key πεδίο το οποίο χρησιμοποιείται για να υλοποιηθεί η τεχνική. Δεν είναι υποχρεωτικό να το δείχνεις όμως.
    Vir prudens non contra ventum mingit
  •  23-10-2007, 11:18 36502 σε απάντηση της 36501

    Απ: Αρίθμηση των rows ενός select command

    Υπάρχει στον πίνακα ένα primary key πεδίο, κάτι σαν id για κάθε χρήστη. Τι ακριβώς πρέπει να προσθέσω στην δεύτερη περίπτωση για να είναι distinct η αρίθμηση, δηλαδή να μην έχω 1,3,3,4 αλλά 1,2,3,4 και ούτω καθεξής;

    Ευχαριστώ.



  •  23-10-2007, 12:12 36505 σε απάντηση της 36502

    Απ: Αρίθμηση των rows ενός select command

    Αντί για ProductID βάλε το PK πεδίο σου. Αν δεν σου τρέξει, καλύτερα να μας δώσεις τη δομή του πίνακα για να δούμε πως θα πρέπει ακριβώς να είναι το query.


    Vir prudens non contra ventum mingit
  •  23-10-2007, 12:39 36507 σε απάντηση της 36505

    Απ: Αρίθμηση των rows ενός select command

    Ο πίνακας έχει την παρακάτω δομή:

        [GameUserId] [bigint] IDENTITY(1,1) NOT NULL,
        [TotalPoints] [bigint] NOT NULL CONSTRAINT [DF_GameUser_TotalPoints]  DEFAULT ((0)),
        [TotalBonus] [bigint] NOT NULL CONSTRAINT [DF_GameUser_TotalBonus]  DEFAULT ((0)),
        [Country] [nvarchar](20) NOT NULL,
        [NumberRounds] [int] NOT NULL CONSTRAINT [DF_GameUser_NuimberRounds]  DEFAULT ((0)),

    To GameUserId είναι το primary key.

    Εκτελώ το παρακάτω script:

    SELECT TOP 10 GameUserId, TotalPoints,
           (SELECT COUNT(*)
            FROM GameUser g2
            WHERE g1.TotalPoints <= g2.TotalPoints
           ) AS rownumber
    FROM GameUser g1 order by TotalPoints DESC


    και παίρνω το εξής αποτέλεσμα:

    GameUserId           TotalPoints          rownumber
    -------------------- --------------------  ---------------
    12                           30                       1
    9                             20                       3
    10                           20                       3
    11                           10                       4

    όπου οι users με ID  9 και 10 έχουν ίδιους πόντους. Θα ήθελα να είχα αρίθμηση 1,2,3,4 και όχι 1,3,3,4 (αν γίνεται)  για να μπορώ να διαλέγω όποιο range σειρών θέλω. Και να σκεφτεί κανείς ότι με μια Row_Number γίνεται χωρίς κόπο. Ευχαριστώ.
  •  23-10-2007, 13:52 36512 σε απάντηση της 36507

    Απ: Αρίθμηση των rows ενός select command

    Όλες αυτές οι λύσεις για row numbering βασίζουνται σε ένα πεδίο με μοναδικές τιμές πάνω στο οποίο γίνεται η ταξινόμηση από την οποία προκύπτει το κάθε row number. Στην περίπτωσή σου το πρόβλημα αλλάζει αφού θες το row numbering να βασίζεται σε πεδίο με μη-μοναδικές τιμές, οπότε υπάρχει ένα work-around:

    SELECT [RANK] = COUNT(*),
       gm1.[GameUserId],
       gm1.[TotalPoints]
    FROM GameUser gm1,
       GameUser gm2
    WHERE CAST(gm1.[TotalPoints] AS CHAR) + CAST(gm1.[GameUserId] AS CHAR) <= CAST(gm2.[TotalPoints] AS CHAR)
       + CAST(gm2.[GameUserId] AS CHAR)
    GROUP BY gm1.[GameUserId],
       gm1.[TotalPoints]
    ORDER BY [RANK]

    To κόλπο είναι ότι επειδή ο συνδυασμός TotalPoints και GameUserID (αν γίνουν concatenate ως strings) είναι μοναδικός ανά εγγραφή, μπορεί να γίνει σύγκριση. Δοκίμασέ το, στη Northwind είναι κάπως έτσι:

    SELECT [RANK] = COUNT(*),
    p1.ProductName,
    p1.UnitPrice
    FROM Products p1,
    Products p2
    WHERE cast(p1.UnitPrice AS CHAR) + p1.ProductName <= CAST(p2.UnitPrice AS CHAR)
    + p2.ProductName
    GROUP BY p1.ProductName,
    p1.UnitPrice
    ORDER BY [RANK]

    Στο δικό σου πίνακα ίσως χρειαστεί λίγο tweaking, δεν προλαβαίνω να βάλω data και να το δοκιμάσω.


    Vir prudens non contra ventum mingit
  •  23-10-2007, 14:11 36515 σε απάντηση της 36512

    Απ: Αρίθμηση των rows ενός select command

    Με μια γρήγορη δοκιμή δούλεψε τέλεια. Ευχαριστώ για τη βοήθεια.
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems