Board logo

標題: [操作疑難] ~~~ oracle stored procedure 難題 ~~~ [打印本頁]

作者: save_null    時間: 2015-12-4 15:29     標題: ~~~ oracle stored procedure 難題 ~~~

oraclestored procedure難題

問題:

Table name : tb1

   Date      ID     Number
04-DEC-15  A2000  024-645071
03-DEC-15  A2000  024-645072
03-DEC-15  A2000  024-645073
              

03-DEC-14  A25458  024-645074


想問下ching, 想用stored procedure做到一個效果是:

我輸入date range, start_date = 03-DEC-15, end_date = 04-DEC-15, 得出以上tb1效果, show 出3條records,
我想寫個stored procedure 是當我輸入date range之後, 去search date range 得出來的3個records 每個record 去比較
一下有否不一樣, 有不一樣的就要顯示出來,
即是由024-645071開始, 024-645071 去碰下一個024-645072, 發現不一樣, 那麼就show 024-645071出來, 做完之後接著再由
024-645072 開始去碰下一個 024-645073, 發現不一樣, 那麼就show 024-645072 出來, 但是做完之後接著再由 024-645073
去碰下一個, 發現已經沒有下一個Number可以做對碰了, 於是為有再去tb1(同一個table) 找相同ID A2000 最接近(03-DEC-15 的這個日子)的出來, 再用024-645073去碰下024-645074, 發現不一樣, 那麼就show 024-645073出來了, 做完.

最後result :
024-645071
024-645072
024-645073


作者: student_abc    時間: 2015-12-4 16:51

oraclestored procedure難題

問題:

Table name : tb1

   Date      ID     Number
04-DEC-15  A2000  02 ...
save_null 發表於 2015-12-4 15:29


Why do you  use oracle ?
it is so expensive.
作者: 7h1r733n    時間: 2015-12-4 17:00

回覆 1# save_null
用個Cursor for loop咁比較唔得咩?
作者: save_null    時間: 2015-12-4 17:02

回覆 3# 7h1r733n

好似好複雜甘樣
作者: 7h1r733n    時間: 2015-12-4 17:11

回覆  7h1r733n

好似好複雜甘樣
save_null 發表於 2015-12-4 17:02


自己研究吓...
https://docs.oracle.com/cd/B1050 ... /a96624/a_samps.htm
作者: student_abc    時間: 2015-12-4 18:22

oraclestored procedure難題

問題:

Table name : tb1

   Date      ID     Number
04-DEC-15  A2000  02 ...
save_null 發表於 2015-12-4 15:29

Why do you  use oracle ?
作者: Databases    時間: 2015-12-4 18:43

提示: 作者被禁止或刪除 內容自動屏蔽
作者: snoopy11hk    時間: 2015-12-4 21:30

本帖最後由 snoopy11hk 於 2015-12-4 22:03 編輯
oraclestored procedure難題

問題:

Table name : tb1

   Date      ID     Number
04-DEC-15  A2000  02 ...
save_null 發表於 2015-12-4 15:29



    其實SQL 用 LAG () Analytics + CASE WHEN  就做到你想要的野
作者: snoopy11hk    時間: 2015-12-4 22:03

回覆  save_null
用個Cursor for loop咁比較唔得咩?
7h1r733n 發表於 2015-12-4 17:00



    得, 但係好慢
作者: idiotricky    時間: 2015-12-4 22:22

sort by which column?
作者: snoopy11hk    時間: 2015-12-4 22:28

sort by which column?
idiotricky 發表於 2015-12-4 22:22



    u can see the action, sort by number
作者: 7h1r733n    時間: 2015-12-5 00:16

得, 但係好慢
snoopy11hk 發表於 2015-12-4 22:03

慢唔慢係睇有幾多data...  index落得好唔好.. 返正佢都係要3條record.. 我又唔覺得好慢.
作者: snoopy11hk    時間: 2015-12-5 00:26

慢唔慢係睇有幾多data...  index落得好唔好.. 返正佢都係要3條record.. 我又唔覺得好慢. ...
7h1r733n 發表於 2015-12-5 00:16


1. 慢 , 用 SP 寫要 有 SQL 同 PL 的 context switch
2. 煩, SQL 短過 PL 好多 (唔洗 loop, 唔洗 bulk fetch)
一句
OPEN CURSOR FOR
SELECT
就完
作者: save_null    時間: 2015-12-7 08:28

回覆 10# idiotricky

sort by date
作者: save_null    時間: 2015-12-7 08:28

研究左兩日還未研究到  
作者: 紫河馬    時間: 2015-12-7 10:47

你係咪想
#1 select by date range
#2 then select lastest date entry for each ID+Number group?
試下用group by / union / minus / sub table 個方法念
唔好用每行每行咁念
作者: 杜龍    時間: 2015-12-7 11:22

select row_number() over blahblah as rowno,    *  from x into temptableX
select row_number() over blahblah -1 as rowno,    *  from x into temptableY
select temptablex x where exists(select 1 from temptableY where Y.rowno = X.rowno and y.[Number] <>X.[Number])
作者: 董事長    時間: 2015-12-7 13:19

即係點...有冇人翻譯?
就咁搵 不同number?
select distinct
作者: 奇雲    時間: 2015-12-7 17:02

本帖最後由 奇雲 於 2015-12-7 17:21 編輯

5 樓已經比晒參考. (1+2 sample).
作者: 奇雲    時間: 2015-12-7 17:04

慢唔慢係睇有幾多data...  index落得好唔好.. 返正佢都係要3條record.. 我又唔覺得好慢. ...
7h1r733n 發表於 2015-12-5 00:16



  如果oracle 咁都叫慢, 其他可以唔洗用.
作者: snoopy11hk    時間: 2015-12-7 21:35

本帖最後由 snoopy11hk 於 2015-12-7 23:54 編輯
如果oracle 咁都叫慢, 其他可以唔洗用.
奇雲 發表於 2015-12-7 17:04



    小弟不才, 現拋磚引玉
OPEN CURSOR FOR
SELECT "DATE", "ID", "Number"
FROM
(
SELECT "DATE", "ID", "Number",
LAG("DATE") OVER (ORDER BY "NUMBER" ASC) PREVIOUS_DATE,
LAG("ID") OVER (ORDER BY "NUMBER" ASC) PREVIOUS_ID,
LAG("NUMBER") OVER (ORDER BY "NUMBER" ASC) PREVIOUS_NUMBER
FROM tb1
WHERE  "DATE"  BETWEEN :START_DATE AND :END_DATE
)
WHERE LNNVL("DATE" = PREVIOUS_DATE) OR  LNNVL("ID" = PREVIOUS_ID) OR LNNVL("NUMBER" =PREVIOUS_NUMBER)

接近(03-DEC-15 的這個日子)的出來, 再用024-645073去碰下024-645074, 呢句唔多明
大約係 lag function 補 CASE WHEN 就可以了
作者: 董事長    時間: 2015-12-8 12:08

樓主題目寫
024-645073 下面無record 就搵同一佪ID 而時間最接近start_date做比較

咁結果點解會係 024-645073 同 024-645074 比較?
024-645074 個ID 係 A25458 並與 A2000 不同
024-645073 同ID 時間最接新3-DEC-15 應該係 024-645072
睇黎睇去佢都只係想響相同date range下搵不同既number

拋豆腐引樓主
SELECT DISTINCT date, id, number
FROM   tb1
WHERE DATE BETWEEN to_date(:start_date,'DD-MON-YYYY')
               AND to_date(:end_date,'DD-MON-YYYY')
ORDER BY date;
作者: 7h1r733n    時間: 2015-12-8 12:28

小弟不才, 現拋磚引玉
OPEN CURSOR FOR
SELECT "DATE", "ID", "Number"
FROM
(
SELECT "DATE", "ID ...
snoopy11hk 發表於 2015-12-7 21:35


我想寫個stored procedure 是當我輸入date range之後, 去search date range 得出來的3個records 每個record 去比較

好在而家唔係考試..
作者: 杜龍    時間: 2015-12-8 14:34

Dear Sir
this is mock version..
And I am happy to offer the full working version for $500 HKD
Best Regards
/****** Script for SelectTopNRows command from SSMS  ******/
SELECT  ROW_NUMBER() over (order by nbr ) as _id,
     date, [id]
      ,[nbr]
  FROM [test].[dbo].[testtable] tbl1
select exist(

  SELECT  ROW_NUMBER() over (order by nbr ) -1 as _id,
     date, [id]
      ,[nbr]
  FROM [test].[dbo].[testtable] tbl2
where tbl1._id = tbl2._id and tbl1.nbr <> tbl2.nbr)
作者: henrywho    時間: 2015-12-9 12:45

研究左兩日還未研究到
save_null 發表於 2015-12-7 08:28


我完全睇唔明個 requirement.





歡迎光臨 電腦領域 HKEPC Hardware (https://h0.hkepc.com/forum/) Powered by Discuz! 7.2