我有桌子=>帖子
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代码首先检查id为no的cat 1中具有最大视图的行。 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的最大视图之后,输出应按类别进行排序,因为所需输出中每个类别中的行数都超过1,我希望按视图所示对视图进行进一步排序。
现在我也想按如下所示的最大视图顺序订购所需的输出表:
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
答案 0 :(得分:1)
如果您要获取post
表中的行,其中每个views
的{{1}}值最高的行的category
多于4,则使用以下查询:
id
答案 1 :(得分:0)
检查一下:
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
答案 2 :(得分:0)
找出每只猫的最大值。仅使用该信息构建临时表。
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
的限制)