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;