2013-09-03 16 views
5

Ho una tabella che sfortunatamente, non posso alterare in alcun modo e devo lavorare con quello che ho.Seleziona il numero più grande dalla tabella MYSQL con prefisso aggiunto

La tabella mysql ha un campo con l'etichetta "customer_id". Ha 2 lettere prefissate con un numero numerico di 4 valori.

EX: BI8392

HE8492

WO1293

Come posso selezionare il più grande valore numerico con un certo prefisso? Ad esempio, supponiamo che volessi selezionare il numero più grande con un prefisso HE. Come posso selezionare quel valore?

Qualsiasi aiuto è assolutamente apprezzato. Sono stato bloccato per un po 'ora.

+0

Sì, sono lasciati imbottiti. – user1011713

risposta

4

Dal momento che tutti i valori a sinistra imbottito si può fare

SELECT RIGHT(MAX(customer_id), 4) max_val 
    FROM table1 
WHERE customer_id LIKE 'HE%' 

Assicurarsi che si dispone di un indice su customer_id che probabilmente non sulla base un nome della colonna. Molto probabilmente lo userò LIKE.

Ecco SQLFiddle demo

+0

Questo ha funzionato. Grazie! – user1011713

+0

@ user1011713 Sei il benvenuto. In bocca al lupo :) – peterm

1

USO:

SELECT MAX(RIGHT(customer_id,4)) AS max fROM table_name 
    WHERE LEFT(customer_id,2)='HE'; 
+0

Hai dimenticato la clausola where per "HE". – wiscWeb

+0

Sì, questo non ha funzionato. – user1011713

+0

Grazie, è corretto. – Salim

0

Se i prefissi hanno la stessa lunghezza, si potrebbe fare:

Ex.

SELECT MID(column_name,start[,length]) FROM table_name; 

compilati:

SELECT MID(customer_id,2,4) FROM table_name; 
2
SELECT LEFT(customer_id,2) AS PREFIX, 
     MAX(RIGHT(customer_id,4)) AS MAX 
FROM table1 
GROUP BY LEFT(customer_id,2) 

SQL Fiddle

MySQL 5.5.32 Setup Schema:

CREATE TABLE Table1 
    (`customer_id` varchar(6)) 
; 

INSERT INTO Table1 
    (`customer_id`) 
VALUES 
    ('DD1234'), 
    ('DD1222'), 
    ('EE2345'), 
    ('EE6789') 
; 

Query 1:

SELECT LEFT(customer_id,2) AS PREFIX, 
     MAX(RIGHT(customer_id,4)) AS MAX 
FROM table1 
GROUP BY LEFT(customer_id,2) 

Results:

| PREFIX | MAX | 
|--------|------| 
|  DD | 1234 | 
|  EE | 6789 | 

EDIT:

SELECT MAX(RIGHT(customer_id,4)) AS MAX 
FROM table1 
GROUP BY LEFT(customer_id,2) 
WHERE LEFT(customer_id,2) = 'HE' 
+0

Sei sicuro che questo ordinerà correttamente numericamente? –

+0

@inflagranti cosa intendi? –

+0

@inflagranti. OP sta cercando di ottenere il valore MAX, non elenca i valori numericamente ... Inoltre, se stai cercando una modifica massima specifica, il 'GROUP BY' in una clausola' WHERE' che si adatta alle tue esigenze. – wiscWeb

0

dati del campione:

mysql> SELECT * FROM Document; 
+--------+-------------+ 
| DataID | Description | 
+--------+-------------+ 
|  1 | BI8392  | 
|  2 | HE8492  | 
|  3 | HE8493  | 
|  4 | HE8490  | 
+--------+-------------+ 

Query:

SELECT MAX(SUBSTR(Description,3)) FROM Document 
WHERE SUBSTR(Description,1,2) = 'HE'; 

Returns:

+----------------------------+ 
| MAX(SUBSTR(Description,3)) | 
+----------------------------+ 
| 8493      | 
+----------------------------+ 
0

In SQL Server, si può fare una stringa e poi a ORDER BY, si avrà bisogno di getto ad un decimale (altrimenti ordinerà da Varchar, Esempio 999 sarà maggiore di 1000)

SELECT SUBSTRING(MyColumn,3, LEN(MyColumn) - 2) 
    FROM dbo.MyTable 
    ORDER BY CAST(SUBSTRING(MyColumn,3, LEN(MyColumn) - 2) as decimal) DESC; 

sopra il numero 3 è se il prefisso è lungo 2 caratteri. Di conseguenza, il numero 2 deve trovare la lunghezza della stringa senza prefisso.

Problemi correlati