Domanda

Come posso usare group by con union in t-sql? Voglio raggruppare per la prima colonna di un risultato di unione, ho scritto il seguente sql ma non funziona. Non so come fare riferimento alla colonna specificata (in questo caso è 1) del risultato del sindacato. grazie mille.

SELECT  *
FROM    ( SELECT    a.id ,
                    a.time
          FROM      dbo.a
          UNION
          SELECT    b.id ,
                    b.time
          FROM      dbo.b
        )
GROUP BY 1
È stato utile?

Soluzione

  

Raggruppa per 1

Non ho mai conosciuto GROUP BY per supportare l'utilizzo di ordinali, solo ORDER BY. Ad ogni modo, solo MySQL supporta GROUP BY che non include tutte le colonne senza funzioni aggregate eseguite su di esse. Gli ordinali non sono raccomandati neanche perché se sono basati sull'ordine del SELECT - se questo cambia, anche il tuo ORDER BY (o GROUP BY se supportato).

Non è necessario eseguire GROUP BY sui contenuti quando si utilizza UNION - UNION garantisce che i duplicati vengano rimossi; UNION ALL è più veloce perché non lo è - e in quel caso avresti bisogno di GROUP BY ...

La tua query deve essere solo:

SELECT a.id,
       a.time
  FROM dbo.TABLE_A a
UNION
SELECT b.id,
       b.time
  FROM dbo.TABLE_B b

Altri suggerimenti

È necessario alias la query secondaria. Pertanto, la tua dichiarazione dovrebbe essere:

Select Z.id
From    (
        Select id, time
        From dbo.tablea
        Union All
        Select id, time
        From dbo.tableb
        ) As Z
Group By Z.id

Identificare la colonna è semplice:

SELECT  *
FROM    ( SELECT    id,
                    time
          FROM      dbo.a
          UNION
          SELECT    id,
                    time
          FROM      dbo.b
        )
GROUP BY id

Ma non risolve il problema principale di questa query: cosa si deve fare con i valori della seconda colonna dopo il raggruppamento per primo? Dato che (in modo particolare!) Stai usando UNION anziché UNION ALL , non avrai righe interamente duplicate tra i due sottotitoli nella unione, ma potresti comunque avere diversi valori di tempo per un valore dell'id e non dai alcun suggerimento su cosa vuoi fare: min, max, avg, sum o cosa ?! Il motore SQL dovrebbe dare un errore a causa di ciò (anche se alcuni come mysql scelgono un valore casuale tra i vari, credo che sql-server sia migliore di così).

Quindi, ad esempio, cambia la prima riga in SELECT id, MAX (time) o simili!

with UnionTable as  
(
    SELECT a.id, a.time FROM dbo.a
    UNION
    SELECT b.id, b.time FROM dbo.b
) SELECT id FROM UnionTable GROUP BY id
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top