Извлечение SQL из таблицы - PullRequest
0 голосов
/ 13 марта 2019

Sales таблица

ItemID  Date               Code
-------------------------------------------------
12345   2019-02-17          1
12345   2019-02-17          2
12345   2019-02-17          3
-------------------------------------------------
12344   2019-02-18          1
12344   2019-02-18          3
12344   2019-02-18          2
-------------------------------------------------
12443   2019-02-19          1
12443   2019-02-19          2
12443   2019-02-19          3

Я хочу получить эти идентификаторы элементов из таблицы Sales, в которой код 2 обновляется после кода 3. Поэтому мой запрос должен возвращать 12344 как результат ...Я не могу придумать какие-либо функции для достижения этой цели, поскольку у меня ограниченные знания по SQL.Может ли кто-нибудь дать мне предложение по достижению этого?Спасибо

Ответы [ 4 ]

0 голосов
/ 14 марта 2019

Если есть только одна строка для itemid и кода, то вы можете просто агрегировать:

select itemid
from mytable
group by itemid
having max(case when code = 2 then date end) > max(case when code = 3 then date end);

Однако с вашими примерами данных не будет возвращен itemid, поскольку все коды для itemid имеют одинаковыеДата.Ни один не предшествует другому.

0 голосов
/ 13 марта 2019

Вы можете включить столбец

update_seq_no

Каждый раз, когда вы обновляете, вы можете увеличивать update_seq_no, а затем вы можете достичь желаемого результата, используя приведенный ниже sql.

alter table sales add (update_seq_no number);

create SEQUENCE  IFSQ_UPDATE_SEQNO  MINVALUE 1000 MAXVALUE 9999999999999999 INCREMENT BY 1 START WITH 1 NOCYCLE ;
  -- for existing rows (just a work around) 
 BEGIN  
 for rec in (select rowid row_id,itemid,date from sales where  update_Seq_no is null order by 2,3 asc)
  loop
  update sales set update_Seq_no=IFSQ_UPDATE_SEQNO.NEXTVAL
  where rowid=rec.row_id;
  commit;
 end loop;
 end;
 --for new rows  
 insert into sales values(p_itemid,p_date,3,IFSQ_UPDATE_SEQNO.NEXTVAL);
 insert into sales values(p_itemid,p_date,2,IFSQ_UPDATE_SEQNO.NEXTVAL);


with sales1 as (select row_num1,a.* from (select rownum row_num1,b.* 
from sales b order by update_seq_no asc)a)
select a.*
from sales1 a,sales1 b
where a.row_num1-1=b.row_num1
and a.code=2 and b.code=3
and a.itemid=b.itemid
and a.Date=b.Date;
0 голосов
/ 13 марта 2019

Вы можете попробовать использовать lag ()

select itemid from
(
select sales1.itemId,sales1.code,
sales1.code-lag(code) over(partition by itemid order by dates) as diff
from sales sales1 
where code in (2,3)
)A where diff>=1
0 голосов
/ 13 марта 2019

Вот запрос, который вы ищете

select sales1.itemId from sales sales1 
       inner join sales sales2 
       on sales1.itemId = sales2.itemId 
       where sales1.date > sales2.date and sales1.code = 2 and sales2.code = 3; 

Проверьте, поможет ли это вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...