Sql 查找具有两列的秩

Sql 查找具有两列的秩,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 b

我有以下查询来查找排名

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

你知道这里有什么问题吗?

可能是这样的:

SELECT a.appName,RANK() 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;
您也可以这样做:

SELECT a.appName,ROW_NUMBER() OVER(PARTITION BY a.appName ORDER BY b.depName)
......
来回应你的评论。你可以这样做:

SELECT a.appName,RANK() 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;

也许是这样的:

SELECT a.appName,RANK() 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;
您也可以这样做:

SELECT a.appName,ROW_NUMBER() OVER(PARTITION BY a.appName ORDER BY b.depName)
......
来回应你的评论。你可以这样做:

SELECT a.appName,RANK() 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;

也许是这样的:

SELECT a.appName,RANK() 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;
您也可以这样做:

SELECT a.appName,ROW_NUMBER() OVER(PARTITION BY a.appName ORDER BY b.depName)
......
来回应你的评论。你可以这样做:

SELECT a.appName,RANK() 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;

也许是这样的:

SELECT a.appName,RANK() 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;
您也可以这样做:

SELECT a.appName,ROW_NUMBER() OVER(PARTITION BY a.appName ORDER BY b.depName)
......
来回应你的评论。你可以这样做:

SELECT a.appName,RANK() 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;
请尝试以下查询:

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;
请尝试以下查询:

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;
请尝试以下查询:

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;
请尝试以下查询:

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;

你想用CTE方法获得前10名。 尝试仅对单个列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

你想用CTE方法获得前10名。 尝试仅对单个列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

你想用CTE方法获得前10名。 尝试仅对单个列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

你想用CTE方法获得前10名。 尝试仅对单个列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

感谢它的工作如果我想找出每个应用程序的排名前十的部门感谢它的工作如果我想找出每个应用程序的排名前十的部门感谢它的工作如果我想找出每个应用程序的排名前十的部门感谢它的工作如果我想找出每个应用程序的排名前十的部门怎么办app@Haider : 更新answer@Haider:更新answer@Haider:更新answer@Haider:更新答案