Ερώτηση για εμφάνιση πεδίων

Συζητήσεις για τον Microsoft SQL Server

Συντονιστές: WebDev Moderators, Super-Moderators

Απάντηση
txc
Δημοσιεύσεις: 626
Εγγραφή: 02 Δεκ 2003 23:08

Ερώτηση για εμφάνιση πεδίων

Δημοσίευση από txc » 24 Απρ 2015 14:12

Καλησπέρα σας,
μια ερώτηση, έχω ένα πίνακα με τα εξής χαρακτηριστικά

id status status1
1 AC 0
1 DC 0
2 AC 1
3 AC 1
4 DC 1

θέλω στα αποτελέσματα να φέρω όλα τα id αλλά για αυτά που έχουν ίδιο id και ίδιο status1 να εμφανίσω το πρώτο status που θα βρω μόνο

Κάποια βοήθεια?
ευχαριστώ

alou
Script Master
Δημοσιεύσεις: 1374
Εγγραφή: 24 Αύγ 2007 19:52
Επικοινωνία:

Ερώτηση για εμφάνιση πεδίων

Δημοσίευση από alou » 24 Απρ 2015 16:05

SELECT id,status,status1
FROM someTable
GROUP BY id,status1

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Ερώτηση για εμφάνιση πεδίων

Δημοσίευση από dva_dev » 24 Απρ 2015 17:05

Έτσι όπως είναι ο πίνακας δεν μπορείς με query. Θα χρειαστείς κάποιο primary key (θα μπορούσες να παίξεις με κάτι προσωρινό σαν το row_number() αλλά χρειάζεσαι sql server 2005+, οπότε δεν θα το έκανα, συν ότι είναι σκότωμα για τη database).

[edit]
Για πόσες εγγραφές μιλάμε;
[/edit]

txc
Δημοσιεύσεις: 626
Εγγραφή: 02 Δεκ 2003 23:08

Ερώτηση για εμφάνιση πεδίων

Δημοσίευση από txc » 25 Απρ 2015 11:31

@alou δε μπορώ να το δοκιμάσω αλλά νομίζω είχα κάνει κάτι αντίστοιχο και δεν έπεξε

@dva_dev δηλαδή πιστεύεις δε μπορεί να βγει αυτό το query?

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Ερώτηση για εμφάνιση πεδίων

Δημοσίευση από dva_dev » 25 Απρ 2015 13:35

Αν ο πίνακας σου έχει μόνο αυτά τα πεδία ίσως και να μπορούσε να παίξει, αλλά δεν ξέρω πόσο αποδοτικά.
Πάντως χρειάζεσαι sql server 2005 και πάνω για να παίξει το row_number() και επίσης σημαντικό: είναι database specific. Δηλαδή δεν πρόκειται να παίξει το query ούτε σε oracle, ούτε σε mysql, ούτε σε access, ούτε σχεδόν πουθενά αλλού. Ενώ αν έχεις κάποιο πεδίο primary key (το συνήθες που βάζουμε, αριθμητικό auto number) που να δηλώνει τη σειρά με την οποία μπήκαν οι εγγραφές (δεν έχει σημασία αν υπάρχουν κενά ανάμεσα στα νούμερα) μπορεί να παίξει παντού.

Για παράδειγμα για sql server 2005+ θα μπορούσες να κάνεις αυτό, αλλά τονίζω ότι εξαρτάται από το πόσα πεδία έχεις και το πλήθος των εγγραφών σου γιατί κάνει full table scan:

Κώδικας: Επιλογή όλων

SELECT id,status,status1
FROM (
	SELECT
		ROW_NUMBER() OVER(PARTITION BY id,status1 ORDER BY id) RN,
		id,status,status1
	FROM mytable
) TMP
WHERE RN=1
Αλλά θα προτιμούσα να έβαζα ένα primary key (π.χ. pk int identity(1,1) σαν primary key και να έκανα αυτό που παίζει παντού και πάει με index scan:

Κώδικας: Επιλογή όλων

SELECT id,status,status1
FROM mytable INNER JOIN (
	SELECT MIN(pk) pk FROM mytable GROUP BY id,status1
) TMP
ON (mytable.pk=tmp.pk);
Προσωπικά θα έκανα το δεύτερο. Το πρώτο θα το χρησιμοποιούσα μόνο σαν τελευταία επιλογή πριν πάω να το κάνω σε κώδικα.

txc
Δημοσιεύσεις: 626
Εγγραφή: 02 Δεκ 2003 23:08

Ερώτηση για εμφάνιση πεδίων

Δημοσίευση από txc » 25 Απρ 2015 13:45

τι ακριβώς κάνεις με το δεύτερο query? επειδή χρησιμοποιείς min() εκεί σε χάνω

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Ερώτηση για εμφάνιση πεδίων

Δημοσίευση από dva_dev » 25 Απρ 2015 14:07

To subquery βρίσκει το πρώτο pk (minimum αφού κάθε εγγραφή που μπαίνει το αυξάνει) για κάθε group από id,status1.

Το εξωτερικό query φέρνει όλα τα υπόλοιπα πεδία για τα pks που έχει βρει το εσωτερικό subquery.

txc
Δημοσιεύσεις: 626
Εγγραφή: 02 Δεκ 2003 23:08

Ερώτηση για εμφάνιση πεδίων

Δημοσίευση από txc » 25 Απρ 2015 14:38

αυτό καταλαβαίνω ότι θα φέρνει τυχαία το πρώτο group που θα βρίσκει, οπότε εγώ αν θέλω μπορώ να του πω να φέρει το πρώτο που θα βρεί αφού τα ταξινομήσει όπως θέλω εγώ

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Ερώτηση για εμφάνιση πεδίων

Δημοσίευση από dva_dev » 25 Απρ 2015 14:49

Τι εννοείς θα φέρει τυχαία το πρώτο group που θα βρίσκει;
Για όλα τα groups από id, status1 θα φέρει το πρώτο pk που βρίσκει σε κάθε group και κατά συνέπεια την πρώτη εγγραφή από κάθε group.

txc
Δημοσιεύσεις: 626
Εγγραφή: 02 Δεκ 2003 23:08

Ερώτηση για εμφάνιση πεδίων

Δημοσίευση από txc » 25 Απρ 2015 15:04

ναι και εγώ πως θα πάρω από αυτές τις 2 εγγραφές :

id status status1
1 AC 0
1 DC 0

την 1 AC 0 που θέλω?

δηλαδή αν η σειρά ήταν ανάποδα θα έφερνε πρώτα την 1 DC 0?

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Ερώτηση για εμφάνιση πεδίων

Δημοσίευση από dva_dev » 25 Απρ 2015 15:34

Αν είχε καταχωρηθεί πρώτα η 1 AC 0 και μετά η 1 DC 0 θα είχες στον πίνακα κάτι σαν

Κώδικας: Επιλογή όλων

pk id status status1
...
15  1 AC     0
...
75  1 DC     0
...
Οπότε θα σου έφερνε αυτή με το μικρότερο pk. Την 1 AC 0 που έχει pk=15

Αν είχαν καταχωρηθεί ανάποδα τότε θα είχες στον πίνακα κάτι σαν

Κώδικας: Επιλογή όλων

pk id status status1
...
17  1 DC     0
...
21  1 AC     0
...
Οπότε θα σου έφερνε αυτή με το μικρότερο pk. Την 1 DC 0 που έχει pk=17

txc
Δημοσιεύσεις: 626
Εγγραφή: 02 Δεκ 2003 23:08

Ερώτηση για εμφάνιση πεδίων

Δημοσίευση από txc » 25 Απρ 2015 15:39

άρα ουσιαστικά έτσι όπως είναι δε μου φέρνει αυτό που θέλω, δε μπορώ εγώ να αλλάξω τη σειρά που διαβάζει τα min?
δηλαδή να του πώ order by status desc για να βρίσκει πάντα τα AC αφού αυτή η σειρά με ενδιαφέρει

αλλιώς η επιλογή θα γίνεται τυχαία

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Ερώτηση για εμφάνιση πεδίων

Δημοσίευση από dva_dev » 25 Απρ 2015 15:43

txc έγραψε:άρα ουσιαστικά έτσι όπως είναι δε μου φέρνει αυτό που θέλω, δε μπορώ εγώ να αλλάξω τη σειρά που διαβάζει τα min?
δηλαδή να του πώ order by status desc για να βρίσκει πάντα τα AC αφού αυτή η σειρά με ενδιαφέρει

αλλιώς η επιλογή θα γίνεται τυχαία
Δεν ζητάς αυτό το πράγμα. Ζητάς κάτι διαφορετικό:
θέλω στα αποτελέσματα να φέρω όλα τα id αλλά για αυτά που έχουν ίδιο id και ίδιο status1 να εμφανίσω το πρώτο status που θα βρω μόνο

txc
Δημοσιεύσεις: 626
Εγγραφή: 02 Δεκ 2003 23:08

Ερώτηση για εμφάνιση πεδίων

Δημοσίευση από txc » 25 Απρ 2015 15:44

ναι είδα το διατύπωσα λάθος, έτσι όπως είναι αυτό που μου έστειλες δε μπορεί να κάνει σορτάρισμα όπως θέλω?

Άβαταρ μέλους
dva_dev
Script Master
Δημοσιεύσεις: 3790
Εγγραφή: 16 Σεπ 2005 01:32
Επικοινωνία:

Ερώτηση για εμφάνιση πεδίων

Δημοσίευση από dva_dev » 25 Απρ 2015 16:02

Μάλλον είναι καλύτερα να παραθέσεις από τον πίνακα σου τις εγγραφές που έχεις (μερικές δεν χρειάζεται όλες) και να σημειώσεις και ποιες είναι αυτές που θέλεις να πάρεις.
Π.χ.
id status status1
1 AC 0 <---
1 DC 0
1 AC 0
1 AC 1
1 AC 1
1 DC 1
1 DC 1
2 AC 1 <---
2 DC 1
3 AC 1 <---
4 DC 1
5 DC 0
5 AC 0 <---

Απάντηση

Επιστροφή στο “MS SQL Server”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 1 επισκέπτης