2015-09-10 2 views
1

Предположим, что у меня есть следующая таблица:Extract Max и Min значения столбца из таблицы в той же строке

ID Bag Event  Count Driver Time 
1 XYZ Pick-up  10  A1  10:30 AM 
2 XYZ Trnsfr-out 10  A1  10:40 AM 
3 XYZ Trnsfr-in 10  A2  10:40 AM 
4 XYZ Drop  10  A2  10:50 AM 
5 ABC Pick-up  10  B1  10:30 AM 
6 ABC Trnsfr-out 10  B1  10:40 AM 
7 ABC Trnsfr-in 10  B2  10:40 AM 
8 ABC Trnsfr-out 10  B2  10:50 AM 

есть в любом случае я могу получить драйверы для MAX (ID) и MIN (ID) для конкретный пакет, используя тот же запрос?

Я следующий запрос прямо сейчас:

Select Bag, Count, Driver as FinalDriver,TIME from Bagtable where ID in (Select Max(ID) from Bagtable Group By Bag) 

Результат является

Bag Count FinalDriver TIME 
XYZ 10  A2   10:50 AM 
ABC 10  B2   10:50 AM 

Я хочу, результат выглядит примерно так: Значение Initial драйвера должно быть получено путем использования мин (ID) для конкретного мешка.

Bag Count InitialDriver FinalDriver TIME 
XYZ 10  A1    A2   10:50 AM 
ABC 10  B1    B2   10:50 AM 

Просьба помочь мне с SQL для вышеуказанного. Спасибо

+1

Вы используете oracle или sql server 2008? –

+0

Я использую SQL Server. Поскольку я хотел знать логику, я также отметил Oracle. – vkr

ответ

1

Если вы используете Oracle (вы помечено этот вопрос как Oracle и SQL Server, которые являются двумя различными базами данных), которые вы могли бы использовать:

select bag, 
     count, 
     min(decode(id, min_bag_id, driver, null)) as initialdriver, 
     min(decode(id, max_bag_id, driver, null)) as finaldriver, 
     min(decode(id, max_bag_id, time, null)) as time 
    from (select id, 
       bag, 
       count, 
       driver, 
       time, 
       min(id) over(partition by bag) as min_bag_id, 
       max(id) over(partition by bag) as max_bag_id 
      from tbl) 
group by bag, 
      count 
+0

Вам не хватает агрегированной функции для переноса операторов 'decode'. Вы, вероятно, хотели использовать 'min (decode (...))' или 'max (decode (...))' – sstan

+0

@sstan да пропустили это, спасибо –

+0

Я думаю, что в подзапросе нужен псевдоним. Спасибо, и это работает – vkr

1

Вы можете сделать это с помощью функций aggregate.

Fiddle with sample data

select b.bag, max(b.count) as count, 
max(case when time = mintime then driver end) as initialdriver, 
max(case when time = maxtime then driver end) as finaldriver, 
max(x.maxtime) as time 
from 
(select bag, min(TIME) as mintime, max(time) as maxtime 
from Bagtable 
group by bag) x 
join Bagtable b 
on x.bag = b.bag 
group by b.bag 
+0

ВРЕМЯ может содержать NULL в таблице. Поэтому его сложно скомпилировать по TIME – vkr

0

Try ниже SQL:

SELECT BAG, 
     COUNT, 
     MAX(DECODE(MIN_RN,1,DRIVER,NULL)) INITIALDRIVER, 
     MAX(DECODE(MAX_RN,1,DRIVER,NULL)) FINALDRIVER, 
     MAX(TIME) TIME 
    FROM (SELECT BAG, 
       COUNT, 
       DRIVER, 
       TIME, 
       ROW_NUMBER() OVER(PARTITION BY BAG ORDER BY ID)  MIN_RN, 
       ROW_NUMBER() OVER(PARTITION BY BAG ORDER BY ID DESC) MAX_RN 
      FROM TAB) 
GROUP BY BAG,COUNT; 
0

Вы отметили свой вопрос как Oracle, так и SQL Server. Два разных существа в плане возможностей.

Вот решение Oracle с использованием некоторых из его агрегатные функции:

select b.bag 
    , max(b.count) as count 
    , min(driver) keep (dense_rank first order by id) initial_driver 
    , min(driver) keep (dense_rank LAST order by id) Final_driver 
    , min(time) keep (dense_rank LAST order by id) time 
from bagtable b 
group by b.bag 

Вы можете увидеть fiddle here

0

ответ, основанный на логике Брайана в SQL

select bag, 
    count, 
    min(case id when min_bag_id then driver else null end) as initialdriver, 
    min(case id when max_bag_id then driver else null end) as finaldriver, 
    min(case id when max_bag_id then tm else null end) as time 
    from (select id, 
      bag, 
      count, 
      driver, 
      tm, 
      min(id) over(partition by bag) as min_bag_id, 
      max(id) over(partition by bag) as max_bag_id 
      from bagtable) a 
group by bag, 
      count 
0

Вы можете попробовать это просто запрос для получения требуемого выхода

выберите Сумка, max (id), min (id) из группы Bagtable от Bagtable;

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