Seleziona la percentuale TOP X (o inferiore) per i valori numerici in MySQL

Mi chiedevo se ci sono funzioni che possono essere utilizzate in MySQL per selezionare la percentuale TOP X (o inferiore) da una colonna contenente valori numerici.

Fondamentalmente, ho una colonna contenente un elenco di prezzi e voglio solo restituire quei campi nel primo dieci percentile di prezzi. Eventuali suggerimenti?

AGGIORNAMENTO : spiegazione molto più approfondita del sobject da parte di una persona molto più consapevole qui . Nondimeno, sembra che non ci sia una funzione incorporata in MySQL per calcolare percentili.

Provare:

SELEZIONA * DA PREZZI WHERE prezzo> = (SELEZIONA 0.9 * max (prezzo) DA prezzi)

SELECT price FROM prices p1 WHERE (SELECT count(*) FROM prices p2 WHERE p2.price >= p1.price) <= (SELECT 0.1 * count(*) FROM prices) ); 

Ciò fornirà il prezzo P1 per il quale il numero di record nella tabella Prezzo con prezzo> = P1 sarà un decimo del numero totale di record nella tabella Prezzi . Dopo di che:

 SELECT * FROM prices WHERE price >= (SELECT price FROM prices p1 WHERE (SELECT count(*) FROM prices p2 WHERE p2.price >= p1.price) <= (SELECT 0.1 * count(*) FROM prices) ); 

restituirà tutti i record desiderati.

Nota: non ho esaminato le prestazioni di questa query, penso che la soluzione con tabella / variabile temporanea deve essere più efficace.

proprio come una FYI (so che questa domanda ha qualche anno), questo può essere fatto anche in altri modi più puliti.

 SELECT * FROM product_table WHERE price >= (SELECT price FROM product_table ORDER BY price DESC LIMIT 1 OFFSET (SELECT 0.1 * COUNT(*) FROM product_table)); 

Ho eseguito una query simile su un database molto grande, e ha funzionato molto rapidamente.

EDIT – nuova risposta

Risposta in Converti query SQL Server in MySQL

 Select * from ( SELECT tbl.*, @counter := @counter +1 counter FROM (select @counter:=0) initvar, tbl ORDER BY ordcolumn ) X where counter <= (50/100 * @counter); ORDER BY ordcolumn 

VECCHIA RISPOSTA

Per MySQL, è ansible calcolare la dimensione del batch richiesta e quindi LIMIT a quel numero di record

 SELECT @rows := ROUND(COUNT(*) * 10/100) FROM table; PREPARE STMT FROM 'SELECT * FROM tbl ORDER BY price LIMIT ?'; EXECUTE STMT USING @rows; 

Per una percentuale in basso, basta ordinare al contrario

 SELECT @rows := ROUND(COUNT(*) * 10/100) FROM table; PREPARE STMT FROM 'SELECT * FROM tbl ORDER BY price DESC LIMIT ?'; EXECUTE STMT USING @rows; 

Oops, forse il DESC appartiene alla prima query, ma ottieni il significato.

Nota Per SQL Server, la clausola TOP N PERCENT aiuta sicuramente

 select top 10 PERCENT * FROM TBL ORDER BY price