2012-03-27 16 views
12

Ho tabella costituita da questi campi:Come gruppo e scegliere il valore più basso in SQL

id | date_from | date_to  | price 
-------------------------------------------- 
CK1  22-12-2012 29-12-2012  800 
CK1  22-12-2012 29-12-2012  1200 
CK2  22-12-2012 29-12-2012  1400 
CK2  22-12-2012 29-12-2012  1800 
CK2  22-12-2012 29-12-2012  2200 

Come faccio a creare SQL SELECT che raggruppa i risultati per ID, DATE_FROM, DATE_TO e picconi valore più basso dal prezzo.

Così risultato sarebbe

CK1  22-12-2012 29-12-2012  800 
CK2  22-12-2012 29-12-2012  1400 

risposta

20
select id, date_from, date_to, min(price) 
from table 
group by id, date_from, date_to 
+0

E se ogni fila di id è un numero unico e non ripetibile come l'esempio nel PO? Come possiamo visualizzare l'id senza raggrupparlo? – frostshoxx

+1

Vedere https://stackoverflow.com/questions/44231218/limit-max-and-group-by-returned-too-many-rows/44231696#44231696 – Phil

+1

È inoltre possibile utilizzare la soluzione seguente utilizzando RANK(). – Phil

3

Ti piace questa:

SELECT id, date_from, date_to, MIN(price) 
FROM TableName 
GROUP BY id, date_from, date_to 
+0

Ho dato questo +1 per neutralizzare il -1 che qualcuno aveva dato senza commentare. Mi sembra a posto. –

+0

@ElRonnoco, Aveva ragione per -1, perché l'ho scritto 'SUM (prezzo)' –

+0

Ah ma non hanno lasciato un commento spiegando così io, a mio parere, erano ancora sbagliati! Un altro motivo per cui dovresti sempre lasciare dei commenti quando fai downvoting alla gente - la risposta che hai downvoted potrebbe cambiare! –

0
SELECT id, date_from, date_to, min(price) 
FROM my_table 
GROUP BY id, date_from, date_to 
3

Se il vostro DBMS supporto CTE allora si può fare in questo modo;

I dati dei test

DECLARE @tbl TABLE 
(
    id VARCHAR(100), 
    date_from VARCHAR(100), 
    date_to VARCHAR(100), 
    price INT 
) 

INSERT INTO @tbl 
VALUES 
    ('CK1','22-12-2012','29-12-2012',800), 
    ('CK1','22-12-2012','29-12-2012',1200), 
    ('CK2','22-12-2012','29-12-2012',1400), 
    ('CK2','22-12-2012','29-12-2012',1800), 
    ('CK2','22-12-2012','29-12-2012',2200) 

Query

;WITH CTE 
AS 
( 
    SELECT 
     RANK() OVER(PARTITION BY id ORDER BY price ASC) AS RowNbr, 
     tbl.* 
    FROM 
     @tbl AS tbl 
) 
SELECT 
    * 
FROM 
    CTE 
WHERE 
    CTE.RowNbr=1 
+0

Questa soluzione è applicabile anche in situazioni più complesse. – DerpyNerd

0

mi accorgo che le risposte di cui sopra hanno associato i dati con il min (prezzo).

Ogni volta che si è tentato di utilizzare la funzione min con i dati associati, è possibile che i dati siano errati. per esempio:

SELECT funder, customer, min(sq.rate) 'Highest Average Rate', max(sq.rate) 'Highest Average Rate' 
FROM tbl_x 
group by funder, customer 
order by rate desc 

"funder" "customer" "HighestRate"   "Highest Rate" 
"1"   "john"   "14.50"    "14.50" 
"2"   "matt"   "13.00"    "13.00" 

come potete vedere ci i valori minimi e massimi sono gli stessi.

Sono sicuro che ci può essere un lavoro in giro da qualche parte, ma questo è solo un testa a testa

Problemi correlati