2016-11-10 2 views
1

Если у меня есть таблица вроде этого:Как найти минимальные значения в столбце в SQL

id name value 
1 abc  1 
2 def  4 
3 ghi  1 
4 jkl  2 

Как я могу выбрать новую таблицу, которая до сих пор имеет id, name, value, но только те, с минимальным значением.

В этом примере мне нужна эта таблица обратно:

1 abc 1 
3 ghi 1 
+1

Что ваша СУБД? Если он поддерживает 'ROW_NUMBER', это просто. – dnoeth

+0

@dnoeth Я использую postgresql – toastedDeli

+0

Проверьте ответ @ Lamak, это еще проще. – dnoeth

ответ

4

Нахождения этих значений довольно прост:

SELECT * 
FROM YourTable 
WHERE value = (SELECT MIN(Value) FROM YourTable); 

Что касается правого синтаксиса для ввода этих строк в другой таблице, что будет зависеть от используемого вами механизма базы данных.

2

Альтернативой решению Lamak может быть использование оконной функции rank. В зависимости от конкретного сценария, он может выполнять довольно лучше:

SELECT id, name, value 
FROM (SELECT id, name, value, RANK() OVER (ORDER BY value ASC) AS rk 
     FROM mytable) t 
WHERE rk = 1 
+1

Мне это нравится, а также вы можете указать определенный ранг 2, 3, 4 и т. Д., Чтобы получить определенный ранг за пределами min или max. – xQbert

+0

@xQbert Это более общее решение, но повышает сканирование и кэширование всей таблицы. – Abelisto

1

не уверен точно, если это то, что вы пытаетесь сделать, но я думаю, что это будет работать:

--creating #temp1 to recreate your table/example 
    CREATE TABLE #TEMP1 
    (id  INT  NOT NULL PRIMARY KEY, 
    name CHAR(3) NOT NULL, 
    value INT  NOT NULL) 


    INSERT INTO #TEMP1 
    VALUES 
    (1,'abc',1), 
    (2,'def',4), 
    (3,'ghi',1), 
    (4,'jkl',2) 

    -verify correct 

    SELECT * FROM #temp1 

    --populate new table with min value from table 1 

    SELECT * 
    INTO #TEMP2 
    FROM #TEMP1 
    WHERE value = (SELECT MIN(value) 
        FROM #TEMP1) 

    SELECT * FROM #TEMP2