AS
является необязательным при использовании псевдонимов столбцов, но не допускаемых Oracle при использовании таблиц сглаживания, включая подзапросы. Так дайте Подзапросу имя, просто не включает AS
ключевое слова:
FROM "Dat_ScheduledEvent" alias1
RIGHT OUTER JOIN (
SELECT "Dts"
FROM TABLE("F_GetDateIntervalTable"("In_OccurredTo", "In_OccurredFrom",
"In_Interval"))
) alias2
Но у вас есть какие-то другие проблемы. Во-первых, создание объектов с идентификаторами, которые должны быть заключены в двойные кавычки, болезненно для работы; имеет ли идентификатор смешанного случая действительно стоит? Во-вторых, похоже, что EventDts
- это только производное поле, а псевдоним столбца не может использоваться нигде в запросе, отличном от предложения order by
, поэтому вам, вероятно, также потребуется сделать этот подзапрос, что означает, что вы можете использовать его в group by
тоже. В-третьих, DATEDIFF
не является встроенной функцией Oracle - если вы не создали ее самостоятельно, вам нужно будет использовать что-то еще.
SELECT
COUNT(alias1."Id") AS "ProcessedEvents",
alias1."EventDts"
FROM (
SELECT "Id",
TO_TIMESTAMP('1900-01-01 00:00:00.000000', 'YYYY-MM-DD HH24:MI:SS.FF')
+ NUMTODSINTERVAL(FLOOR(DATEDIFF('MI', '1900-01-01', "ProcessedDate")
/"In_Interval")*"In_Interval", 'MINUTE') AS "EventDts"
FROM "Dat_ScheduledEvent"
WHERE "ProcessedDate" BETWEEN "In_OccurredFrom" AND "In_OccurredTo"
) alias1
RIGHT OUTER JOIN (
SELECT "Dts"
FROM TABLE("F_GetDateIntervalTable"("In_OccurredTo", "In_OccurredFrom",
"In_Interval"))
) alias2
ON alias1."EventDts" = alias2."Dts"
GROUP BY alias2."EventDts";
DATEDIFF
все еще нуждается в замене, но я не совсем уверен, что вы делаете. Если F_GetDateIntervalTable
генерирует подходящие интервалы, я не уверен, зачем вам это нужно; вы не хотите находить ProcessedDate
значений в пределах интервалов, то есть >=
Dt and <
Dt + InInterval
? В зависимости от того, что на самом деле представляет InInterval
, конечно.
Предполагая, что F_GetDateIntervalTable
дает начало каждого интервала в период интереса, вы можете сделать что-то вроде этого, вместо:
PROCEDURE "GetProcessedEvents"
(
"In_OccurredFrom" TIMESTAMP,
"In_OccurredTo" TIMESTAMP,
"In_Interval" DECIMAL,
"Out_Cursor" OUT "Ref_Cursor"
)
IS
BEGIN
OPEN "Out_Cursor" FOR
SELECT
COUNT(Event."Id") AS "ProcessedEvents",
DateInt."Dts"
FROM (
SELECT "Dts", COALESCE(LEAD("Dts")
OVER (ORDER BY "Dts"), "In_OccurredTo") as "NextDts"
FROM TABLE("F_GetDateIntervalTable"("In_OccurredTo", "In_OccurredFrom",
"In_Interval"))
) DateInt
LEFT JOIN "Dat_ScheduledEvent" Event
ON Event."ProcessedDate" >= DateInt."Dts"
AND Event."ProcessedDate" < DateInt."NextDts"
GROUP BY DateInt."Dts"
ORDER BY DateInt."Dts";
END "GetProcessedEvents";
/
LEAD()
позволяет заглянуть в следующий результат, так что подзапрос преобразует список временных меток в список из временных и временных меток (с последним заканчивается на In_OccurredTo
), что позволяет искать соответствующие записи в вашей таблице данных, которые попадают в эти диапазоны - никакие манипуляции с ProcessedDate
не являются необходимо.
С некоторыми поддельные данные:
create table "Dat_ScheduledEvent" ("Id" number, "ProcessedDate" timestamp);
insert into "Dat_ScheduledEvent" ("Id", "ProcessedDate")
values (1, to_timestamp('2013-02-06 09:45', 'YYYY-MM-DD HH24:MI'));
insert into "Dat_ScheduledEvent" ("Id", "ProcessedDate")
values (1, to_timestamp('2013-02-06 09:50', 'YYYY-MM-DD HH24:MI'));
insert into "Dat_ScheduledEvent" ("Id", "ProcessedDate")
values (1, to_timestamp('2013-02-06 10:15', 'YYYY-MM-DD HH24:MI'));
... и вызова процедуры из SQL * Plus:
var r refcursor;
alter session set nls_date_format = 'YYYY-MM-DD HH24:MI';
exec "GetProcessedEvents"(to_date('2013-02-06 08:00'), to_date('2013-02-06 12:00'), 1/24, :r);
print :r
...Я получаю:
ProcessedEvents Dts
---------------------- -------------------------
0 06-FEB-13 08.00.00.000000000
2 06-FEB-13 09.00.00.000000000
1 06-FEB-13 10.00.00.000000000
0 06-FEB-13 11.00.00.000000000
Что вы имеете в виду, когда говорите, что он не работает? Что не работает? Вы получаете неправильные данные или это просто не работает? Возможно, описание того, что он должен делать, может помочь. Все это malarkey с «In_interval» немного сложно понять. –