Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 考虑到Oracle中的多个列,如何对密集列重新排序?_Sql_Oracle - Fatal编程技术网

Sql 考虑到Oracle中的多个列,如何对密集列重新排序?

Sql 考虑到Oracle中的多个列,如何对密集列重新排序?,sql,oracle,Sql,Oracle,我有一个查询,它有密集的列和行数列: WITH CTE AS( SELECT A.SL_NO, A.ACC_NO, A.ACC_NAME DENSE_RANK() OVER(ORDER BY A.ACC_NO, A.ACC_NAME) DRN, ROW_NUMBER() OVER(PARTITION BY A.ACC_NO, A.ACC_NAME ORDER BY A.SL_NO) RN FROM TEST_TBL A ) SELEC

我有一个查询,它有密集的列和行数列:

WITH CTE AS(
    SELECT
    A.SL_NO, 
    A.ACC_NO, 
    A.ACC_NAME
    DENSE_RANK() OVER(ORDER BY A.ACC_NO, A.ACC_NAME) DRN,
    ROW_NUMBER() OVER(PARTITION BY A.ACC_NO, A.ACC_NAME ORDER BY A.SL_NO) RN
    FROM TEST_TBL A 
)
SELECT * 
FROM CTE A
ORDER BY A.SL_NO;
查询结果为:

SL_NO   ACC_NO  ACC_NAME DRN RN
1        234      UNIP    3   1
2        234      UNIP    3   2
3        234      UNIP    3   3
4        256      PURP    4   1
5        256      PURP    4   2
6        289      KFAR    5   1
7        210      FHAS    2   1
8        210      FHAS    2   2
9        210      FHAS    2   3
10       110      PURP    1   1
11       110      PURP    1   2
12       110      PURP    1   3
13       110      PURP    1   4
但是您想按如下方式排列DRN列(排名必须根据acc_no和acc_name列):


需要建议,以实现它与或不使用密集_排名。提前谢谢

看起来您只是希望
DRN
列按照
SL_NO
列的顺序排列为密集列。我们可以子查询一次,任意取每个帐户的最小
SL_NO
值,然后使用稠密排名:

WITH cte AS (
    SELECT
        SL_NO, 
        ACC_NO, 
        ACC_NAME,
        ROW_NUMBER() OVER(PARTITION BY ACC_NO, ACC_NAME ORDER BY SL_NO) RN,
        MIN(SL_NO) OVER (PARTITION BY ACC_NO, ACC_NAME) AS SL_NO_MIN
    FROM TEST_TBL A
)

SELECT
    SL_NO, 
    ACC_NO, 
    ACC_NAME,
    DENSE_RANK() OVER (ORDER BY SL_NO_MIN) AS DRN,
    RN
FROM cte
ORDER BY
    SL_NO;


它可以工作!谢谢…我不知道聚合函数也适用于over和partition…记住:Windows函数总是在查询中最后运行(嗯…可能除了
ORDER BY
)。因此,如果您有一个
分组依据
查询并使用一个窗口函数,那么窗口函数将在
分组依据
之后进行计算,并且您只能引用其中的聚合。
WITH cte AS (
    SELECT
        SL_NO, 
        ACC_NO, 
        ACC_NAME,
        ROW_NUMBER() OVER(PARTITION BY ACC_NO, ACC_NAME ORDER BY SL_NO) RN,
        MIN(SL_NO) OVER (PARTITION BY ACC_NO, ACC_NAME) AS SL_NO_MIN
    FROM TEST_TBL A
)

SELECT
    SL_NO, 
    ACC_NO, 
    ACC_NAME,
    DENSE_RANK() OVER (ORDER BY SL_NO_MIN) AS DRN,
    RN
FROM cte
ORDER BY
    SL_NO;