2015-08-04 2 views
2

Привет всем Я пытаюсь найти способ, чтобы выбрать минимальное или максимальное из диапазона данных на основе этих условий:SQL выбрать минимальное или максимальное основываясь на состоянии

  • Если setuptime и processtime смещ_по_столбцам являются все 0 выберите MIN (oprNum) (операция еще не началась, так что получите первый oprnum)
  • Если время настройки и время процесса не равны 0, получите max oprnum (активная операция).

Основываясь на любом из них, я хочу ОДИН ряд ... Пожалуйста, см. Прилагаемый пример данных. Благодаря! Это часть гораздо большего запроса, поэтому мне нужно 1 выходной строке на PRODID ...

+------------+--------+---------+--------------------+--------------------+ 
| ProdId  | OprNum | Company | SetupTime   | ProcessTime  | 
+------------+--------+---------+--------------------+--------------------+ 
| 12M0003381 | 10  | 12  | 1.3400000000000000 | 1.6100000000000000 | 
+------------+--------+---------+--------------------+--------------------+ 
| 12M0003381 | 10  | 12  | 0.0000000000000000 | 0.0000000000000000 | 
+------------+--------+---------+--------------------+--------------------+ 
| 12M0003381 | 15  | 12  | 1.0000000000000000 | 0.0000000000000000 | 
+------------+--------+---------+--------------------+--------------------+ 
| 12M0003381 | 50  | 12  | 0.0000000000000000 | 0.0000000000000000 | 
+------------+--------+---------+--------------------+--------------------+ 
| 12M0003381 | 60  | 12  | 0.0000000000000000 | 0.0000000000000000 | 
+------------+--------+---------+--------------------+--------------------+ 
| 12M0003381 | 60  | 12  | 0.0000000000000000 | 0.0000000000000000 | 
+------------+--------+---------+--------------------+--------------------+ 
| 12M0003381 | 70  | 12  | 0.0700000000000000 | 0.0400000000000000 | 
+------------+--------+---------+--------------------+--------------------+ 
| 12M0003381 | 70  | 12  | 0.0000000000000000 | 0.0000000000000000 | 
+------------+--------+---------+--------------------+--------------------+ 
+0

Рассматривали ли вы использовать саз? –

+0

Я попробовал утверждение case, но не могу получить правильный вывод (1 строка) – jhowe

+0

Опубликовать то, что вы пробовали, пожалуйста: D – Andrew

ответ

2

обновленный запрос: на основе последнего комментария

, если максимальная запись имеет 0 раз, я хочу выбрать последнюю запись, которую имеет время настройки или время процесса. Если добавить эту строку в вашей скрипку («12M0003381», 80,12,0.00,0.00) Я получаю эту строку, когда я хочу последний с setuptime или процесса временем

логики, используемые этим запросом это просто вычислить дополнительный столбец weighted_value. Во внешнем запросе мы используем значение min over value и max over weighted value, как раньше.

select 
    t.prodId, 
    case when MAX(t.setuptime+ t.processtime)>0 then MAX(t.weighted_value) else MIN(t._value) end as value 
from (
    select 
     prodID, 
     oprnum as _value, 
     setuptime, 
     processtime, 
     case 
      when setuptime+processtime>0 
      then oprnum 
      else NULL 
      end as weighted_value from tbl 
    ) t 
group by t.prodID 

обновлена ​​ссылка скрипки: http://sqlfiddle.com/#!6/b7ecb/20

пожалуйста, попробуйте этот запрос

select t1.ProdId, case when exists(
select 1 from tbl t2 where t2.setuptime >0 or t2.Processtime>0 and t2.prodId=t1.prodId 
) then MAX(t1.oprNum) ELSE MIN(t1.oprNum) END 
from tbl t1 
group by ProdId 

SQL ссылку скрипку http://sqlfiddle.com/#!6/c52e22/1

+0

это делает то же самое, что и другой, однако то, что я сказал в своем последнем комментарии, если максимальная запись имеет 0 раз, я хочу выбрать последнюю запись с временем настройки или временем процесса. Если я добавлю эту строку в свою скрипку («12M0003381», 80,12,0.00,0.00), я получаю эту строку, когда я хочу последний с настройкой или временем процесса, спасибо за вашу помощь. – jhowe

+0

Я только что заметил, что предложение where внизу будет фильтровать любые записи, у которых есть все 0 processtime и 0 setuptime, возможно, должно быть ... где t1.setuptime> = 0 ИЛИ t1.processtime> = 0? – jhowe

+0

да, это то, что я сделал. Я обновил вашу скрипку, все время меняю на 0, а затем получаю 0 строк, в которых в этой ситуации мне нужен MIN (oprnum) ..., который будет 10 ... – jhowe

2

Один из способов:

SELECT 
    ProdId, 
    CASE WHEN SUM(SetupTime) + SUM(ProcessTime) = 0 THEN MIN(oprNum) ELSE MAX(oprNum) END 
FROM T 
GROUP BY ProdId 
+0

Я думаю, что это то, что я был после! не могу поверить, что я был настолько глуп, чтобы не думать об этом ... Я обошел дома, пытаясь найти решение ... – jhowe

+0

Как я могу расширить это, чтобы показать MAX (OprNum), который имеет время? так что на максимальной части я бы хотел добавить MAX (oprNum) WHERE setuptime + processtime <> 0 ... – jhowe

+0

Я буду отмечать это как ответ, так как это было то, что я изначально хотел ... – jhowe

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