поиск ранга с двумя столбцами oracle

#sql #oracle

#sql #Oracle

Вопрос:

у меня есть следующий запрос, чтобы найти ранг

 SELECT a.appName,RANK() OVER (PARTITION BY a.appName, b.depName ORDER BY a.appName) 
as RANK,b.depName,Count(distinct a.userName) as visitors FROM tbl_app_webstats a 
inner join tbl_users b on  b.userName = a.userName 
where a.date_time between '01-JUN-12' and '20-JUN-14' and a.appName like '%' 
group by a.appName,b.depName order by a.appName;
 

но это дает мне неверный результат

 appName            RANK  depName   visitors
app1                1     dep1      1
app1                1     dep2      1
app1                1     dep3      2
app2                1     dep1      3
app2                1     dep2      1
app2                1     dep3      5
app3                1     dep2      2
app3                1     dep5      8
app4                1     dep1      2
app4                1     dep5      13
app5                1     dep5      2
 

результат должен быть таким

 appName            RANK  depName   visitors
app1                1     dep1      1
app1                2     dep2      1
app1                3     dep3      2
app2                1     dep1      3
app2                2     dep2      1
app2                3     dep3      5
app3                1     dep2      2
app3                2     dep5      8
app4                1     dep1      2
app4                2     dep5      13
app5                1     dep5      2
 

есть идеи, что здесь может быть не так?

Ответ №1:

Попробуйте следующий запрос:

 SELECT a.appName,
RANK() OVER (PARTITION BY a.appName ORDER BY b.depName) 
as RANK,
b.depName,Count(distinct a.userName) as visitors FROM tbl_app_webstats a 
inner join tbl_users b on  b.userName = a.userName 
where a.date_time between '01-JUN-12' and '20-JUN-14' and a.appName like '%' 
group by a.appName,b.depName order by a.appName;
 

РЕДАКТИРОВАТЬ: чтобы получить 10 лучших рангов

 SELECT * FROM
(
    SELECT a.appName,
    RANK() OVER (PARTITION BY a.appName ORDER BY b.depName) 
    as RANK,
    b.depName,Count(distinct a.userName) as visitors FROM tbl_app_webstats a 
    inner join tbl_users b on  b.userName = a.userName 
    where a.date_time between '01-JUN-12' and '20-JUN-14' and a.appName like '%' 
    group by a.appName,b.depName order by a.appName
) WHERE RANK <=10
order by appName;
 

Комментарии:

1. спасибо, что это работает, что, если бы я хотел узнать топ-10 лучших отделов для каждого приложения

Ответ №2:

Может быть, что-то вроде этого:

 SELECT a.appName,RANK() OVER (PARTITION BY a.appName ORDER BY b.depName) 
......
 

Вы также могли бы сделать это:

 SELECT a.appName,ROW_NUMBER() OVER(PARTITION BY a.appName ORDER BY b.depName)
......
 

Чтобы адресовать вам комментарий. Вы могли бы сделать что-то вроде этого:

 WITH CTE
AS
(
    SELECT RANK() OVER(PARTITION BY appName ORDER BY depName) AS Rank
    ....
)
SELECT
    *
FROM
    CTE
WHERE
    CTE.Rank<=10;
 

Комментарии:

1. @Haider: Обновите ответ

Ответ №3:

Вы хотите, чтобы ТОП-10 означал использование метода CTE. Попробуйте разделить только один столбец a.AppName

Предположим, вы используете средства разделения на два столбца (

 app1                     dep1      =1st Statement Combination is 1
app1                     dep2      =2nd Statement Combination is 1
app1                     dep3      =3rd Statement Combination is 1



  With CTE(A_Name,A_Rank,A_DepName,A_Visitor)
  AS
  (

    SELECT a.appName,RANK() OVER (PARTITION BY a.appName  ORDER BY a.appName) 
    as RANK,b.depName,Count(distinct a.userName) as visitors FROM tbl_app_webstats a 
    inner join tbl_users b on  b.userName = a.userName 
    where a.date_time between '01-JUN-12' and '20-JUN-14' and a.appName like '%' 
    group by a.appName,b.depName order by a.appName
)
Select * from CTE where A_Rank <=10