並べ替えを使用したいので、OVER
を使用せずにSQLでROW_NUMBER()
を使用する方法はありますか?.
構成可能な行を持つ複数のソート可能な列を持つグリッドがあります。私のシナリオでは、order byは可変なので、ROWNUMを使用して順序を付けることができません。
select ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) as number from Task order by RuleId
私は別のロジックを使用してこれに取り組みました。毎日チェックして平日か休日かを確認する代わりに、営業日のみをリストするテーブルを作成し、n番目の値を取得します。
CREATE OR REPLACE FUNCTION add_n_working_days (
start_date DATE, working_days PLS_INTEGER
) RETURN DATE AS
l_end_date DATE := start_date;
l_counter pls_integer := 0;
BEGIN
SELECT
business_day
INTO l_end_date
FROM
(
WITH
dates AS
(SELECT start_date + level - 1 as dt FROM dual CONNECT BY level < 100)
,weekdates AS
(SELECT dt as weekday FROM dates WHERE TO_CHAR(dt,'fmdy') NOT IN ('sat','Sun'))
,business_days AS
(
SELECT weekday as business_day FROM weekdates
MINUS
SELECT holiday FROM so_holidays
)
SELECT business_day, ROW_NUMBER() OVER (ORDER BY 1) as rn from business_days
)
WHERE rn = working_days + 1;
RETURN l_end_date;
END add_n_working_days;
Working_daysが高すぎる場合は、その値100を変数にすることをお勧めします。