sql代码,用于显示id大于4的每个类别的最大视图数

ykejflvf  于 2021-06-21  发布在  Mysql
关注(0)|答案(3)|浏览(262)

我有一张table

id  || category || views
-------------------------------
 1   |  cat1    |  100
 2   |  cat2    | 2900  <==== most views in cat 2
 3   |  cat3    |  200
 4   |  cat1    | 1900  <==== most views in cat 1
 5   |  cat1    |  800
 6   |  cat2    |  800
 7   |  cat3    | 2700  <==== most views in cat 3
 8   |  cat2    |  900
 9   |  cat3    |  100
 10  |  cat1    |  100
 11  |  cat2    |  1200
 12  |  cat3    |  1500
 13  |  cat3    |  1100
 14  |  cat2    |  1700
 15  |  cat1    |  100

现在,如果单击“类别”选项卡来排列只是为了理解,它将在我的数据库中按如下方式排列表:

id  || category || views
    -------------------------------
     1   |  cat1    |  5100  <==== most views in cat 1
     4   |  cat1    |  1900  
     5   |  cat1    |  800
     10  |  cat1    |  100
     15  |  cat1    |  100

     5   |  cat2    | 2000  <==== most views in cat 2
     6   |  cat2    |  800
     8   |  cat2    |  900
     11  |  cat2    |  1200
     14  |  cat2    |  1700

     3   |  cat3    |  200
     7   |  cat3    | 3000  <==== most views in cat 3
     9   |  cat3    |  100
     12  |  cat3    |  1500
     13  |  cat3    |  1100

现在,我希望sql代码首先检查cat1中具有max views的行,该行的id号为1,如上所示。现在,如果该行(即id号1)的id小于等于4,则不要在此处显示该类别的任何行我不希望sql代码在跳过id号1之后重新检查另一行的最大视图数,一旦id号小于等于4的最大行sql代码应跳过该类别,则该类别的任何行都不应显示在结果中。现在检查下一个类别和循环。
我现在想给出如下所需的输出:

id  || category || views
    -------------------------------
     5   |  cat2    |  2000  <==== most views in cat 2
     14  |  cat2    |  1700
     11  |  cat2    |  1200
     8   |  cat2    |  900
     6   |  cat2    |  800

     7   |  cat3    | 3000  <==== most views in cat 3
     12  |  cat3    |  1500
     13  |  cat3    |  1100
     3   |  cat3    |  200
     9   |  cat3    |  100

注意:cat1和cat2之间的差距只是为了区分类别和你的理解,我不想在我的输出差距。
现在,在检查了id大于4的max视图之后,输出应该按类别排序,因为在所需的输出中,每个类别中有超过1行,我希望它按视图进一步排序,如上所示。
现在我还想按max视图的顺序排列所需的输出表,如下所示:

id  || category || views
    -------------------------------
     7   |  cat3    | 3000  <==== most views in cat 3
     12  |  cat3    |  1500
     13  |  cat3    |  1100
     3   |  cat3    |  200
     9   |  cat3    |  100

     5   |  cat2    |  2000  <==== most views in cat 2
     14  |  cat2    |  1700
     11  |  cat2    |  1200
     8   |  cat2    |  900
     6   |  cat2    |  800

因为id 7的值小于id 5
提前谢谢。
我编辑的查询@radim baca:

select p0.*
from post p0 
join post p1 on p0.category= p1.category
join
(
    select p2.category, max(p2.views) as max_views
    from post p2
    group by p2.category
) p2 on p2.category= p1.category and 
        p2.max_views = p1.views and
        p1.id > 4 order by p2.max_views desc, category desc , views desc
wfypjpf4

wfypjpf41#

切科特:

create table demo(id int , category nvarchar(max) , vview int)

insert into demo(id,category,vview)  values 
(1,'cat1',100),(2,'cat1',500),(3,'cat2',400),(4,'cat2',1100),
(5,'cat3',700),(6,'cat3',1800),(7,'cat1',5800),(8,'cat3',3500)

select id, rank() over(partition by category order by vview desc)  rankk , 
category , vview from demo order by rankk

在这里工作:http://sqlfiddle.com/#!18/e5f89型

uqcuzwp8

uqcuzwp82#

找出每只猫的最大值。用这些信息建立一个临时表。

cat2  2000
cat3  3000

CREATE TEMPORARY TABLE t (PRIMARY KEY cat)
    SELECT cat, MAX(views) AS max_views FROM post GROUP BY cat;

我们将使用数字而不是名称进行最终排序。

SELECT cat, views
    FROM post
    JOIN t USING(cat)
    ORDER BY t.max_views DESC, post.views DESC;

(我不明白关于 id>4 )

slhcrj9b

slhcrj9b3#

如果你想从 post 表中具有最高 views 每种价值 categoryid 超过4则使用以下查询:

select p0.*
from post p0 
join post p1 on p0.category= p1.category
join
(
    select p2.category, max(p2.views) as max_views
    from post p2
    group by p2.category
) p2 on p2.category= p1.category and 
        p2.max_views = p1.views and
        p1.id > 4
order by p2.max_views desc, p0.vview desc

相关问题