SQL中没有over的ROW_NUMBER()

33
有没有一种不用使用 OVER 的方式在 SQL 中使用 ROW_NUMBER(),因为我想要使用排序。
我有一个带有多个可排序列和可配置行的表格。在我的情况下,排序是可变的,这就是为什么我不能使用 ROWNUM 进行排序的原因。

2
MySQL没有ROW_NUMBER。你为什么要用MySQL标记这个? - Mark Byers
3
是的,这是语法的强制要求。请进一步解释你需要的根本原因,而不是你提出的解决方案。 - Martin Smith
你还不知道你需要什么。为什么你需要ROW_NUMBER呢?它如何适用于此?提供一个示例可能会使事情更清晰。 - Martin Smith
@MartinSmith 假设我想一次显示50行,目前我正在从数据库中获取所有数据。我有一个分页功能,可以告诉我要显示的记录数,这就是为什么我使用ROW_NUMBER()的原因。 - Haseeb Akhtar
@HaseebAkhtar - 所以你正在使用 ROW_NUMBER 来返回第 51-100 条记录?如果没有定义顺序,你如何期望 SQL Server 知道你想要的顺序呢? - Martin Smith
显示剩余3条评论
3个回答

87
select ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) as number from Task order by RuleId

这是否与 ROW_NUMBER() OVER(Order By RuleId) 相同?我也不想在 OVER 语句中重复相同的 Order By 子句。 - hazimdikenli
2
不,它们并不相同,但对于此查询会产生相同的结果。您可以使用(SELECT NULL)而不是真实列,在任何(我认为)使用row_number()的复杂情况中跳过“窗口”排序。 - SalientBrain

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);

虽然这段代码可能回答了问题,但是提供关于为什么和/或如何回答问题的额外背景信息可以提高其长期价值。 - Al Foиce ѫ

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;

如果工作日过高,我建议将该值100变成一个变量。

你是不是把答案发错问题了?这个答案似乎与问题无关。 - Michael Z.
看起来是这样。而且一年多以来没有人告诉我 :) - Koen Lostrie
在第二次审查中,我确实看到您正在使用ROW_NUMBER。也许您可以解释一下它如何应用于这个问题。我甚至认为在MSSQL中,在OVER中使用ORDER BY 1是不起作用的。在来这里之前,我就尝试过了 ;) - Michael Z.
另一个答案就是我在寻找的。 - Michael Z.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接