2012-03-27 19 views
12

tengo tabla que consta de los siguientes campos:Como grupo y seleccione el valor más bajo en 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 

¿Cómo creo SQL seleccionar que agrupa los resultados por ID, DATE_FROM, DATE_TO y selecciones de valor más bajo de precio.

Así resultado sería

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

Respuesta

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

¿Qué pasaría si cada fila de ID es un número único y no repetible como el ejemplo en el PO? ¿Cómo podemos mostrar la identificación sin agruparla? – frostshoxx

+1

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

+1

También se puede utilizar la siguiente solución usando RANK(). – Phil

3

De esta manera:

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

He dado este +1 para contrarrestar el -1 que alguien le había dado sin hacer ningún comentario. Luce bien para mi. –

+0

@ElRonnoco, tenía razón para -1, porque lo escribí 'SUM (precio)' –

+0

¡Ah, pero no dejaron un comentario explicando así que en mi opinión todavía estaban equivocados! Otra razón por la que siempre debes dejar comentarios cuando bajas personas: ¡la respuesta que bajaste puede cambiar! –

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

Si su DBMS cte apoyo luego se puede hacer como esto;

Los datos de prueba

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) 

consulta

;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

Esta solución también es aplicable en situaciones más complejas. – DerpyNerd

0

Me he dado cuenta de que las respuestas anteriores han asociado con los datos de los valores mínimo (precio).

Siempre que he intentado utilizar la función min con los datos asociados, es posible que los datos sean incorrectos. por ejemplo:

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 

da

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

como se puede ver que los valores mínimos y máximos son los mismos.

Estoy seguro de que puede haber un trabajo en torno a este lugar, pero esto es sólo un cabezas

Cuestiones relacionadas