#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