26

有什么方法可以ROW_NUMBER()在不使用 SQL 的情况下使用OVER,因为我想使用排序。

我有一个带有多个可排序列和可配置行的网格。在我的场景中,order by 是可变的,这就是为什么我无法使用 ROWNUM 下订单的原因。

4

3 回答 3

72
select ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) as number from Task order by RuleId
于 2013-10-03T14:43:24.250 回答
0
select
a.City,
a.len
from
(
select city,length(city) AS len,
row_number()over(order by length(city) desc, city) as hi,
row_number()over(order by length(city), city) as lo
from
STATION) as a where (a.lo=1 or a.hi=1);
于 2021-06-17T15:02:35.917 回答
0

我使用不同的逻辑来解决这个问题。我没有检查每一天并验证它是工作日还是假期,而是创建了一个仅列出工作日的表,然后取第 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 作为变量。

于 2020-02-12T10:03:38.480 回答