2012-03-16 4 views
1

У меня есть таблица вроде:SQL - выбрать строка из группы на основе нескольких значений

| ID | Val | 
+-------+-----+ 
| abc-1 | 10 | 
| abc-2 | 30 | 
| cde-1 | 10 | 
| cde-2 | 10 | 
| efg-1 | 20 | 
| efg-2 | 11 | 

и хотел бы, чтобы получить результат, основанный на подстроки (ID, 1, 3) и минимального значения и IST должны быть только первый в случае Val повторяющиеся

| ID | Val | 
+-------+-----+ 
| abc-1 | 10 | 
| cde-1 | 10 | 
| efg-2 | 11 | 

проблема заключается в том, что я застрял, потому что я не могу использовать группы по подстроку (ID, 1,3), ID, так как он будет иметь снова 2 строки (каждая по ABC-1 и ABC-2)

+0

U можно сгруппировать по подстроке (ID, 1,3) вместо подстроки (ID, 1,3), ID. Это будет работать ... – Teja

ответ

9
WITH 
    sorted 
AS 
(
    SELECT 
    *, 
    ROW_NUMBER() OVER (PARTITION BY substring(id,1,3) ORDER BY val, id) AS sequence_id 
    FROM 
    yourTable 
) 
SELECT 
    * 
FROM 
    sorted 
WHERE 
    sequence_id = 1 
+0

+1 Я просто писал ответ, когда увидел, что вы избили меня. Очень хорошо! –

+0

@RRZEurope. Что он сделает, это взять все записи, которые имеют одинаковые первые три символа в поле 'id' и группировать их вместе. Он будет заказывать их так, чтобы наименьший «val» был первым, а самый низкий «id» на первом месте, если val привязан. Затем внешний запрос будет выбирать первую запись из каждой группы. Каковы значения ** real *** 'id'? Может ли быть больше трех символов перед '-'? Если это так, 'SUBSTRING (id, 1,3)' нуждается в изменении, чтобы соответствовать поведению ваших данных. – MatBailie

+0

Thx - отлично :-) –

0
SELECT SUBSTRING(id,1,3),MIN(val) FROM Table1 GROUP BY SUBSTRING(id,1,3); 

Вы были группирования столбцов, используя как SUBSTRING (id, 1,3), id вместо просто SUBSTRING (id, 1,3). Он отлично работает. Проверьте тот же пример в приведенной ниже ссылке.

http://sqlfiddle.com/#!3/fd9fc/1

+0

За исключением того, что OP хочет получить *** весь *** 'id' в результатах, а не только подстроку(). И этот 'id' должен быть тем, который соответствует« MIN (val) ». – MatBailie

Смежные вопросы