[英]SQL Select 1 line in function of 3 MAX/MIN fields
我嘗試基於此功能創建視圖,或暫時選擇一個視圖:
SELECT
FLAG
FROM
(
SELECT
TE.FLAG
FROM
EVT E
INNER JOIN EVT_TYP TE ON TE.ID = E.FK_TYPE_EVT
WHERE
E.FK_OBJECT = NUMOBJECT
order by
trunc(E.EVT_DATE) desc,
e.evt_number desc,
e.id desc
)
where
rownum = 1;
NUMOBJECT是函數參數。 函數為該NUMOBJECT返回一個FLAG。 我想為每個E.FK_OBJECT IN EVT表選擇一個標志。
問題是我可以在同一天的EVT表中有幾行用於一個E.FK_OBJECT,並且在大多數情況下我沒有時間作為日期的一部分。 E.evt_number可以為int或NULL。 而且E.id與E.EVT_DATE的順序不同。
我不知道該如何成功,請您能幫我嗎? 我嘗試使用imbricates select,但是看起來由於NULL e.evt_number的原因不可能。
我在Oracle DB上工作。
編輯:數據樣本: Heberger圖片http://img15.hostingpics.net/thumbs/mini_229922Sanstitre.png
我嘗試了這個:
SELECT E.Fk_Object
,TE.FLAG
FROM (
SELECT
E.Fk_Object
,E.EVT_DATE
,E.evt_number
,MAX(E.id) id
FROM (
SELECT
E.Fk_Object
,E.EVT_DATE
,MAX(NVL(e.evt_number, - 1)) evt_number
FROM (
SELECT
E.Fk_Object
,MAX(E.EVT_DATE) EVT_DATE
FROM EVT E
GROUP BY E.Fk_Object
) E_MAX
INNER JOIN EVT E ON E.Fk_Object = E_MAX.Fk_Object
AND E.EVT_DATE = E_MAX.EVT_DATE
WHERE e.flg_suppression = 0
AND e.evt_date IS NOT NULL
GROUP BY E.Fk_Object
,E.EVT_DATE
) E_MAX_2
INNER JOIN EVT E ON E.Fk_Object = E_MAX_2.Fk_Object
AND E.EVT_DATE = E_MAX_2.EVT_DATE
AND NVL(e.evt_number, - 1) = NVL(E_MAX_2.evt_number, - 1)
GROUP BY E.Fk_Object
,E.EVT_DATE
,E.evt_number
) E_MAX_3
left JOIN EVT E ON E.Fk_Object = E_MAX_3.Fk_Object
AND E.EVT_DATE = E_MAX_3.EVT_DATE
AND NVL(e.evt_number, - 1) = NVL(E_MAX_3.evt_number, - 1)
AND E.id = E_MAX_3.id
INNER JOIN EVT_TYP TE ON TE.id = E.FK_EVT_TYP
ORDER BY 2
,3;
但是它給我的結果與函數不同
完成!
我必須使用NVL(E_MAX_2.evt_number,99)而不是NVL(E_MAX_2.evt_number,-1),並且不要忘記E.EVT_DATE的trunc()保持與函數相同的順序,這沒關系! 這樣,它可以在12秒內運行。 該功能之前是54。 我將測試創建一個視圖,看看是否更好。
如果我理解正確,那么您正在尋找一個查詢,該查詢不僅為一個對象而且為多個對象提供最新標志。 您可以通過選擇所有這些對象的記錄,然后使用Oracle的KEEP FIRST/LAST
按對象進行分組來做到這一點。
select
e.fk_object,
max(te.flag) keep (dense_rank first
order by trunc(e.evt_date) desc, e.evt_number desc, e.id desc) as current_flag
from evt e
join evt_typ et on et.id = e.fk_type_evt
where fk_object in (numobject1, numobject2, numobject3)
group by e.fk_object;
同樣可以用作子查詢。 假設您有一個帶有STATUS
列的表OBJECTS
,並且想要顯示狀態為'new'的所有對象及其各自的當前標志:
select o.*, flags.current_flag
from objects o
join
(
select
e.fk_object,
max(te.flag) keep (dense_rank first
order by trunc(e.evt_date) desc, e.evt_number desc, e.id desc) as current_flag
from evt e
join evt_typ et on et.id = e.fk_type_evt
group by e.fk_object
) flags on flags.fk_object = o.id
where o.status = 'new';
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.