web-dev-qa-db-ja.com

SQLではオーバーなしのROW_NUMBER()

並べ替えを使用したいので、OVERを使用せずにSQLでROW_NUMBER()を使用する方法はありますか?.

構成可能な行を持つ複数のソート可能な列を持つグリッドがあります。私のシナリオでは、order byは可変なので、ROWNUMを使用して順序を付けることができません。

19
Haseeb Akhtar
select ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) as number from Task order by RuleId
47
SalientBrain

私は別のロジックを使用してこれに取り組みました。毎日チェックして平日か休日かを確認する代わりに、営業日のみをリストするテーブルを作成し、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を変数にすることをお勧めします。

0
Koen Lostrie