2010-05-24 6 views
2

Прежде всего, пожалуйста, не стесняйтесь, если я правильно не сформулирую вопрос SQL.Группировка и получение последней записи в таблице для каждой группы

У меня есть таблица с несколькими столбцами данных. Критерии выбора для моих групп таблиц на основе столбца 1 (порядок #). В каждом порядке может быть несколько элементов, но элемент # не сгруппирован.

Пример:

Order  Customer  Order Date  Order Time  Item  Quantity 
123456 45   01/02/2010  08:00   140  4 
123456 45   01/02/2010  08:30   270  29 
123456 45   03/03/2010  09:00   140  6 
123456 45   04/02/2010  09:30   140  10 
123456 45   04/02/2010  10:00   270  35 

Что мне нужно это результат, как:

Order  Customer  Order Date  Order Time  Item  Quantity 
123456 45   04/02/2010  09:30   140  10 
123456 45   04/02/2010  10:00   270  35 

Этот результат показывает, что после всех изменений окончательный заказ включает в себя 10 пункта 140 и 35 пункта 270.

Возможно ли это.

питон

+1

Pls не использует форматирование вкладок –

+0

Какая база данных и версия? –

ответ

0

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

With RankedItems As 
(
Select Order, Customer, [Order Date], [Order Time], Item, Quantity 
    , Row_Number() Over(Partition By Order, Customer, Item Order By [Order Date] Desc, [Order Time] Desc) As Num 
From Table 
) 
Select Order, Customer, [Order Date], [Order Time], Item, Quantity 
From RankedItems 
Where Num = 1 

Вот более базы данных агностик решение:

Select T.Order, T.Customer, T.[Order Date], T.[Order Time], T.Item, T.Quantity 
From Table As T 
Where T1.[Order Date] = (
     Select Max(T1.[Order Date]) 
     From Table As T1 
     Where T1.Order = T.Order 
     And T1.Customer = T.Customer 
     And T1.Item = T.Item 
    ) 
And T1.[Order Time] = (
     Select Max(T1.[Order Time]) 
     From Table As T1 
     Where T1.Order = T.Order 
     And T1.Customer = T.Customer 
     And T1.Item = T.Item 
     And T1.[Order Date] = T.[Order Date] 
     ) 

Загвоздка в этом последнем решении, что если существует несколько строк с тем же порядком, Заказчик, Предмет, Дата заказа и заказа времени, вы получите несколько в этом выводе.

1

Поскольку вы не упомянуть об этом, я полагаю, вы используете Oracle:

SELECT ORDER, CUSTOMER, ITEM, MAX(ORDER_TIMESTAMP), MAX(QUANTITY) 
    FROM (SELECT ORDER, 
       CUSTOMER, 
       ITEM, 
       TO_DATE(TO_CHAR(ORDER_DATE, 'YYYY-MM-DD') || ' ' || 
         TO_CHAR(ORDER_TIME, 'HH:MI:SS'), 'YYYY-MM-DD HH:MI:SS') 
       AS ORDER_TIMESTAMP, 
       QUANTITY 
      FROM MY_TABLE) 
    GROUP BY ORDER, CUSTOMER, ITEM; 

Делите и наслаждайтесь.

+0

Я не вижу суммы, используемой на основе ожидаемого результата. –

+0

Не Oracle. Я пытаюсь создать представление SQL из таблицы Macola. – Lisa

+0

@OMG Пони - вы правы - неправильно читайте с моей стороны. Изменено до MAX и на самом деле еще нуждается в дальнейшей коррекции, так как не гарантируется, что строка с MAX (ORDER_TIMESTAMP) будет соответствовать строке с MAX (QUANTITY), но я отпущу ее в этот момент. –

0

Ответ Боба выглядит неплохо, но из-за чтения запроса он выглядит так, как будто желаемый - это максимум столбца количества, а не сумма, что означало бы изменение суммарного выражения «SUM (QUANTITY)» на «MAX (QUANTITY)».

+0

вы и OMG Ponies оба правильны - неправильно читайте с моей стороны. –

+0

И вы совершенно правы в строках MAX (ORDER_TIMESTAMP) и MAX (QUANTITY). При условии, что QUANTITY строго возрастает, тогда мы в порядке, и это будет обеспечиваться тем, что клиенты не могут вернуть товар или что нет возможности для отмены покупок. –

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