作者: 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
自己研究吓...
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
得, 但係好慢
作者: idiotricky 時間: 2015-12-4 22:22
sort by which column?
作者: snoopy11hk 時間: 2015-12-4 22:28
u can see the action, sort by number
作者: 7h1r733n 時間: 2015-12-5 00:16
慢唔慢係睇有幾多data... index落得好唔好.. 返正佢都係要3條record.. 我又唔覺得好慢.
作者: snoopy11hk 時間: 2015-12-5 00:26
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
如果oracle 咁都叫慢, 其他可以唔洗用.
作者: snoopy11hk 時間: 2015-12-7 21:35
本帖最後由 snoopy11hk 於 2015-12-7 23:54 編輯
小弟不才, 現拋磚引玉
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
我完全睇唔明個 requirement.

