簡體   English   中英

SQL在3個MAX / MIN字段的函數中選擇1行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM