обновление столбца на основе максимальной даты и группы по - PullRequest
2 голосов
/ 07 февраля 2012

у меня есть три таблицы orders, orders_delivered, orders_delivered_sta и данные в трех таблицах выглядят как

таблица заказов

orders_id 
 10
 11                      
 12
 13

таблица orders_delivered

orders_delivered_id    orders_id
       10                 1000                                  
       10                 1001                                  
       11                 1002                            
       12                 1003
       12                 1004
       13                 1005 
       13                 1006
       13                 1007

таблицаorders_delivered_sta

  orders_delivered_sta_id   orders_delivered_id   date     now_ind
            1                  1000             02/11/2011   0
            2                  1000             01/10/2006   0
            3                  1000             09/13/2011   0
            4                  1001             01/19/2010   0
            5                  1001             02/21/2011   0
            6                  1002             02/11/2009   0
            7                  1002             08/27/2010   0
            8                  1003             07/15/2012   0
            9                  1004             03/09/2007   0
            10                 1010             10/01/2010   0
            11                 1011             03/27/2011   0
            12                 1012             07/25/2010   0
            13                 1013             09/18/2004   0

, поэтому мне нужно обновить таблицу orders_delivered_sta так, чтобы now_ind был равен 1 для максимальной даты одного orders_delivered_id, как для одной orders_delivered_id 1000, максимальная дата составляет 13.09.2011 для этого набора orders_delivered_id идата (1000,09 / 13/2011) значение now_ind должно быть равно 1, и если столбец orders_delivered_id имеет один и только один идентификатор, то его следует изменить на 1

, в таблице orders_delivered_sta есть данные, которых нет втаблицы orders и orders_delivered, которые не нужно менять.для orders_delivered_id, находящегося в таблице oreders_delivered, нужно только изменить

, поэтому требуемый результат должен выглядеть следующим образом:

таблица orders_delivered_sta

 orders_delivered_sta_id   orders_delivered_id   date     now_ind
            1                  1000             02/11/2011   0
            2                  1000             01/10/2006   0
            3                  1000             09/13/2011   1
            4                  1001             01/19/2010   0
            5                  1001             02/21/2011   1
            6                  1002             02/11/2009   0
            7                  1002             08/27/2010   1
            8                  1003             07/15/2012   1
            9                  1004             03/09/2007   1
           10                 1010             10/01/2010   0
           11                 1011             03/27/2011   0
           12                 1012             07/25/2010   0
           13                 1013             09/18/2004   0

структура таблицы:

create table orders
(
 order_id int primary key  
)

insert into orders select 10
insert into orders select 11                      
insert into orders select 12
insert into orders select 13

create table orders_delivered
( 
  orders_delivered_id int primary key, 
   orders_id int FOREIGN KEY(orders_id)REFERENCES orders (orders_id)
)
insert into orders_delivered select   1000,10                                  
insert into orders_delivered select   1001,10                                  
insert into orders_delivered select   1002,11                            
insert into orders_delivered select   1003,12
insert into orders_delivered select   1004,12
insert into orders_delivered select   1005,13 
insert into orders_delivered select   1006,13
insert into orders_delivered select   1007,13

create table orders_delivered_sta
( 
  orders_delivered_sta_id int primary key, 
   orders_delivered_id int FOREIGN KEY(orders_delivered_id)REFERENCES orders_delivered (orders_delivered_id), 
   date char(10),
  now_ind int
)

insert into orders_delivered_sta select 1,1000,'02/11/2011', 0
insert into orders_delivered_sta select 2,1000,'01/10/2006', 0
insert into orders_delivered_sta select 3,1000,'09/13/2011', 0
insert into orders_delivered_sta select 4,1001,'01/19/2010', 0
insert into orders_delivered_sta select 5,1001,'02/21/2011', 0
insert into orders_delivered_sta select 6,1002,'02/11/2009', 0
insert into orders_delivered_sta select 7,1002,'08/27/2010', 0
insert into orders_delivered_sta select 8,1003,'07/15/2012', 0
insert into orders_delivered_sta select 9,1004,'03/09/2007', 0
insert into orders_delivered_sta select 10,1010,'10/01/2010', 0
insert into orders_delivered_sta select 11,1011,'03/27/2011', 0
insert into orders_delivered_sta select 12,1012,'07/25/2010', 0
insert into orders_delivered_sta select 13,1013,'09/18/2004', 0

Ответы [ 3 ]

3 голосов
/ 08 февраля 2012

Вы можете использовать CTE и окно MAX():

;
WITH max_dates AS (
  SELECT
    *,
    max_date = MAX(date) OVER (PARTITION BY orders_delivered_id)
  FROM orders_delivered_sta
  WHERE orders_delivered_id IN (SELECT orders_delivered_id FROM orders_delivered)
)
UPDATE max_dates
SET now_ind = 1
WHERE date = max_date

Ссылки:

0 голосов
/ 07 февраля 2012

Это запрос в MySQL, но его перевод на SQL-сервер должен быть простым, так как я использую простой SQL.Обратите внимание, что я изменил дату на другую форму (ГГГГ-ММ-ДД), чтобы избежать приведений от строки к дате.

update t3
set t3.now_ind = 1
where t3.orders_delivered_sta_id in (
    select distinct t1.orders_delivered_sta_id from t1
    left join (
        select t2.orders_delivered_id, max(t2.adate) as MaxDate from t2
        group by t2.orders_delivered_id
    ) t2 on (t1.orders_delivered_id = t2.orders_delivered_id) and (t1.adate = t2.MaxDate)
    where t2.orders_delivered_id is not null
) and exists (
    select * from o1
    join od1 on (o1.order_id = od1.orders_delivered_id)
    where (t3.orders_delivered_id = od1.orders_id)
)

Вот пример

Надеюсь, это поможет

PS: Вам действительно нужны эти 3 таблицы ... В следующий раз я лучше прочитаю вопросы:)

0 голосов
/ 07 февраля 2012

Попробуйте это:

UPDATE    orders_delivered_sta
SET       now_ind = 1
WHERE     orders_delivered_sta_id IN(
          SELECT     orders_delivered_sta_id
          FROM       (
                      SELECT     orders_delivered_sta_id,
                                 ROW_NUMBER() OVER(PARTITION BY orders_delivered_id ORDER BY date DESC) AS num
                      FROM       orders_delivered_sta) AS T
          WHERE      T.num = 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...