2016-02-23 13 views
9

Quindi avrei qualcosa di simile. Il risultato è una query in due tabelle.Rimozione di duplicati da una sola colonna

+------------------+------------------------------------+ 
| character_name | title        | 
+------------------+------------------------------------+ 
| derp    | a         | 
| derp    | b         | 
| derp    | c         | 
| herp    | a         | 
| herp    | b         | 
| herp    | c         | 
+-------------------------------------------------------+ 

e voglio che questo

+------------------+------------------------------------+ 
| character_name | title        | 
+------------------+------------------------------------+ 
| derp    | a         | 
|     | b         | 
|     | c         | 
| herp    | a         | 
|     | b         | 
|     | c         | 
+-------------------------------------------------------+ 

è possibile?

+0

È possibile fare riferimento alla mia risposta qui ==> http://stackoverflow.com/questions/35125619/updating-column-in-sqlserver-based-on-values-from-another-column/35126041#35126041 –

+0

Immagino stai cercando di dire: rimuovere i duplicati quando DISPLAY – SIDU

+0

Voglio solo rimuovere i duplicati per la colonna character_name. – isignisign

risposta

4

È questo che intendi?

select case when i.rnk = 1 THEN i.character_name ELSE '' END as NAME 
, i.title 
from(
    select * 
    , row_number() over (partition by character_name order by title) as rnk 
    from t1 
) i 
order by i.character_name 

Il nome otterrà il valore 1, che viene visualizzato nel risultato, qualsiasi altra cosa nascondi.

Update - MySql versione:

SET @r_name:=''; 

select name, title FROM (
    select @r_name:=CASE WHEN @r_name = name THEN '' 
    ELSE name 
    END AS name 
    , @r_name:=name 
    , title 
    FROM 
    t1 
) t2 
+0

questa query è per mysql ?! – ashkufaraz

+0

@ashkufaraz Non avevo prestato attenzione ai tag, ho aggiunto un aggiornamento, grazie. – artm

2

si può fare con assist di una variabile utente.

SQL:

SET @last_name = ''; 
SELECT 
    IF(switch_name, tbl2.character_name, '') character_name, 
    tbl2.title 
FROM 
    (
    SELECT 
     character_name, 
     title, 
     character_name != @last_name switch_name, 
     @last_name:=character_name 
    FROM 
     tbl 
    ) tbl2; 

Risultato:

mysql> SELECT character_name, title FROM tbl; 
+----------------+-------+ 
| character_name | title | 
+----------------+-------+ 
| derp   | a  | 
| derp   | b  | 
| derp   | c  | 
| herp   | a  | 
| herp   | b  | 
| herp   | c  | 
+----------------+-------+ 
6 rows in set (0.00 sec) 

mysql> SET @last_name = ''; 
Query OK, 0 rows affected (0.00 sec) 

mysql> 
mysql> SELECT 
    ->  IF(switch_name, tbl2.character_name, '') character_name, 
    ->  tbl2.title 
    -> FROM 
    ->  (
    ->  SELECT 
    ->   character_name, 
    ->   title, 
    ->   character_name != @last_name switch_name, 
    ->   @last_name:=character_name 
    ->  FROM 
    ->   tbl 
    -> ) tbl2; 
+----------------+-------+ 
| character_name | title | 
+----------------+-------+ 
| derp   | a  | 
|    | b  | 
|    | c  | 
| herp   | a  | 
|    | b  | 
|    | c  | 
+----------------+-------+ 
6 rows in set (0.00 sec) 
2

che funzionerà per la vostra tavola dato

SELECT CASE 
    WHEN character_name ='derp' AND title ='a' THEN 'derp' 
    WHEN character_name ='derp' AND title ='b' THEN '' 
    WHEN character_name ='derp' AND title ='c' THEN '' 
    WHEN character_name ='herp' AND title ='a' THEN 'herp' 
    WHEN character_name ='herp' AND title ='b' THEN '' 
    WHEN character_name ='herp' AND title ='c' THEN '' 
    end as character_name, 
    title 
    from table_name; 

NOTA: se i dati sono dinamici o non come indicato sopra, allora si devi riscrivere/ottimizzare la query per ottenere il risultato desiderato.

Problemi correlati