Domanda

Il mio capo mi ha dato un incarico che non sono sicuro che sia possibile poiché dopo circa due settimane, non riesco a trovare una soluzione, quindi lo sto lanciando per chiedere qualsiasi tipo di aiuto dalla SO gruppo. Se questo ti spezza il cervello, mi scuso.

Prima un po 'di background: sviluppiamo un'applicazione di interrogazione del database che consente agli utenti di recuperare tutto ciò che desiderano dal database senza dover conoscere alcun SQL.

Il mio problema: vogliamo personalizzare il modo in cui " Distinto " viene utilizzata la selezione. Invece di applicare la parola chiave distinta alle righe selezionate, vogliamo che si applichi solo a determinati campi, in modo che vengano utilizzate le prime righe corrispondenti ai campi. Per un esempio:

Bob Jones, 122 Main Street, Portland, OR
Sue Jones, 122 Main Street, Portland, OR
Mary Smith, 458 32nd Street, Portland, OR
Ralph Smith, 458 32nd Street, Portland, OR

vogliamo che funzioni così che vengano restituite solo le prime righe per ciascun indirizzo come segue:

Bob Jones, 122 Main Street, Portland, OR
Mary Smith, 458 32nd Street, Portland, OR

Con il normale distinto, verranno restituite tutte e quattro le righe, che è più di quanto desideriamo. Qualcuno ha qualche idea su come possiamo fare per fare questo? Grazie.

È stato utile?

Soluzione

WITH NumberedRows AS (
   SELECT FirstName, LastName, Address,
          ROW_NUMBER() OVER (PARTITION BY Address ORDER BY Id) as RowNumber
   FROM Table
) SELECT FirstName, LastName, Address
  FROM NumberedRows
  WHERE RowNumber = 1;

PARTITION BY Address specifica l'elenco di colonne che si desidera raggruppare e ORDER BY ID indica l'elenco di colonne che si definisce il "primo" oggetto con.

(Assicurati che l'istruzione precedente sia terminata da un punto e virgola.)

Altri suggerimenti

Devi eseguire un normale " SELECT DISTINCT " istruzione sql che richiede solo distinzioni per i campi effettivamente necessari. Quindi, una volta recuperati, esegui un'altra query che prende il record TOP 1 con dati corrispondenti per ottenere i campi non distinti. Al momento non vedo un modo per farlo in una singola istruzione SQL ...

SELEZIONA MIN (a.firstname + a.lastname), indirizzo da x Raggruppa per indirizzo.

Questa è una risposta eccessivamente semplicistica, ma ti fa guadagnare punti. restituirà solo il "meno" " nome per ciascun indirizzo distinto.

Dovrai usare la concatenazione dei campi per fare anche le distinzioni, ma ti darà ciò di cui hai bisogno.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top