2012-04-25 1 views
1

Мне нужен результат для каждой комбинации (from_id, to_id), которая имеет значение minimun и цикл, соответствующий критериям.Запрос Sql для возврата одной отдельной записи для каждой комбинации в таблице

Так что в принципе мне нужен цикл с минимальным значением. например От A до B мне нужно значение minimun и loop_id.

Таблица содержит следующие поля:

value  from_id to_id  loop_id 
------------------------------------- 

2.3   A   B   2 

0.1   A   C   2 

2.1   A   B   4 

5.4   A   C   4 

Так результат будет:

value  from_id to_id  loop_id 
------------------------------------- 

2.1   A   B   4 

0.1   A   C   2 

Я попытался следующим:

SELECT t.value, t.from_id, t.to_id,t.loop_id 
FROM myresults t 
INNER JOIN (
    SELECT min(m.value), m.from_id, m.to_id, m.loop_id 
    FROM myresults m where m.loop_id % 2 = 0 
    GROUP BY m.from_id, m.to_id, m.loop_id 
) x 
    ON (x.from_id = t.from_id and x.to_id=t.to_id and x.loop_id=t.loop_id) 
    AND x.from_id = t.from_id and x.to_id=t.to_id and x.loop_id=t.loop_id 

Но она возвращается все петли. Спасибо заранее!

+0

Удалить loop_id из внутренней производной таблицы и, следовательно, также присоединиться к внешнему запросу. Затем он вернет минимальное значение для каждой комбинации, а во внешнем запросе вы можете найти соответствующий loop_id. – kaj

+0

Привет, Кай, есть ли у вас пример этого запроса? Спасибо – baboso

+0

@baboso как об этом вопросе. 'SELECT min (value) as value, from_id, to_id от myresults group BY from_id, to_id' –

ответ

2

Как я понимаю проблему, это будет работать:

SELECT t.value, t.from_id, t.to_id, t.loop_id 
FROM MyResults t 
     INNER JOIN 
     ( SELECT From_ID, To_ID, MIN(Value) [Value] 
      FROM MyResults 
      WHERE Loop_ID % 2 = 0 
      GROUP BY From_ID, To_ID 
     ) MinT 
      ON MinT.From_ID = t.From_ID 
      AND MinT.To_ID = t.To_ID 
      AND MinT.Value = t.Value 

Однако, если вы имели одинаковые значения для комбинации From_ID и To_ID например

value  from_id to_id  loop_id 
------------------------------------- 

0.1   A   B   2 

0.1   A   B   4 

Это вернет обе строки.

Если вы используете SQL-Server 2005 или более поздней версии, и вы хотите, повторяющиеся строки, как указано выше, вы можете использовать:

SELECT Value, From_ID, To_ID, Loop_ID 
FROM ( SELECT *, MIN(Value) OVER(PARTITION BY From_ID, To_ID) [MinValue] 
      FROM MyResults 
     ) t 
WHERE Value = MinValue 

Если вы не хотите, повторяющиеся строки, вы можете использовать это:

SELECT Value, From_ID, To_ID, Loop_ID 
FROM ( SELECT *, ROW_NUMBER() OVER(PARTITION BY From_ID, To_ID ORDER BY Value, Loop_ID) [RowNumber] 
      FROM MyResults 
     ) t 
WHERE RowNumber = 1 
+0

От A до B min (значение) равно 2.1, а loop_id равно 4. . Ваш запрос возвращает значение worng и loop_id для подключения AB – baboso

+0

Аполлис, я неправильно понял критерии. Я думаю, что мое редактирование будет отсортировано. – GarethD

+0

Работа идеально! благодаря – baboso

1

Разве вы не можете сделать это намного проще?

SELECT 
    from_id, 
    to_id, 
    MIN(value) 
FROM 
    myresults 
WHERE 
    loop_id % 2 = 0 
GROUP BY 
    from_id, 
    to_id 

Возможно, я не понимаю вопроса.

EDIT: Чтобы включить loop_id

SELECT 
    m2.from_id, 
    m2.to_id, 
    m2.value, 
    m2.loop_id 
FROM 
    myresults m2 INNER JOIN 
    (SELECT 
     m1.from_id, 
     m1.to_id, 
     MIN(m1.value) 
    FROM 
     myresults m1 
    WHERE 
     m1.loop_id % 2 = 0 
    GROUP BY 
     m1.from_id, 
     m1.to_id) minset 
    ON 
     m2.from_id = minset.from_id 
    AND m2.to_id = minset.to_id 
    AND m2.value = minset.value 
+0

Проблема в том, что мне нужно также получить loop_id. Таким образом, это не будет работать: ВЫБОР from_id, to_id, MIN (значение), loop_id ОТ myresults ГДЕ loop_id% 2 = 0 GROUP BY from_id, to_id, loop_id – baboso

+0

О, А не было t замечает loop_id в результатах. Извините, вы правы. Будет обновлено ... – njr101

+0

См. Мой комментарий к вопросу - это получает правильное подмножество строк, но OP также хочет видеть loop_id. Таким образом, вам нужен внешний запрос, чтобы отобразить это, но не использовать его при определении соответствующих строк. – kaj

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