ORDER_ID TRANSACT_TIME
AAA 24-JUL-17 04.05.54.491000000 PM
AAA 24-JUL-17 04.05.54.496000000 PM
AAA 24-JUL-17 04.05.54.504000000 PM
BBB 24-JUL-17 04.05.54.491000000 PM
BBB 24-JUL-17 04.05.54.497000000 PM
BBB 24-JUL-17 04.05.54.505000000 PM
... ...
此數據(訂單ID和Transaction_Time)每小時左右發佈到表中。在Oracle中編寫遞歸函數SQL
我想在Oracle SQL中創建一個函數(或SQL查詢)以確保每個後續事務時間大於或等於先前的條目。
基本上AAA中的第二個條目不能比AAA中的第一個條目具有更早的事務時間,依此類推。
我想就如何去寫這個函數做一些指導。一個想法,我發現是寫一個遞歸函數,我想是這樣的,但我不完全知道是怎麼回事:
Note: PREV_TRANS_TIME is an alias I generated to grab the transaction
time of the previous transaction (meaning for first entry PREV_TRANS_TIME = null)
CREATE OR REPLACE FUNCTION TransactTimeChecker(PREV_TRANS_TIME) RETURN STRING AS
BEGIN
IF prev_trans_time > transact_time THEN
RETURN (I'm not sure what to write
here but I need to fix the entries so the order is adjusted)
ELSIF prev_trans_time <= transact_time THEN
RETURN (we are good, no problem)
ELSE
--Do nothing
END IF;
END;
當您引用具有相同'order_id'的行時,可以使用「後續」,「前一個」,「第二個」,「第一個」等詞。這意味着他們以某種方式被命令。與您在紙上或屏幕上看到的不同,數據庫中的行不是**排序的。你需要一個明確的排序標準,然後才能說出「後續」等。明顯的排序是通過'transact_time'來完成的,但顯然在你的問題中情況並非如此,因爲你必須檢查事務處理的時間實際上是否正確。其他**排序是否有,以確定「第一」,「第二」等?你沒有提到任何。 – mathguy
表上的檢查約束可能是此需求的最佳解決方案。你看過他們(例如https://www.techonthenet.com/oracle/check.php)。 –
我同意@Mathguy。這看起來像是一個架構問題。什麼產生'order_id,transact_time'?大概是數據庫之外的東西。爲什麼按照transact_time排序不能保證正確的排序? – APC