首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于公共值的按值、字母表和频率分组和排序

基于公共值的按值、字母表和频率分组和排序
EN

Stack Overflow用户
提问于 2020-02-24 15:29:53
回答 2查看 73关注 0票数 0

因此,我正在使用MS,并将这个参与者列表分为年龄、名称和age_group三列,并希望首先按名称、年龄以及基于相同名称的age_group的频率排序。例如:

代码语言:javascript
运行
复制
age | age_group |name  
----------------------
1      0-1        Jeff
10     10=<       Dave
10     10=<       Dave
5      5-7        Carl
2      2-4        Sam
3      2-4        Carl
4      2-4        Sam
2      2-4        Sam
5      5-7        Carl
6      5-7        Jeff
7      5-7        Dave
10     10=<       Jeff
8      8-9        Jeff

所以它首先看起来像这样,按名字和年龄排序。

代码语言:javascript
运行
复制
----------------------
10     10=<       Jeff
8      8-9        Jeff
6      5-7        Jeff
1      0-1        Jeff
10     10=<       Dave
10     10=<       Dave
7      5-7        Dave
5      5-7        Carl
5      5-7        Carl
3      2-4        Carl
4      2-4        Sam
2      2-4        Sam
2      2-4        Sam

最后通过age_group频率降序10=<,8-9,5-7,2-4,0-1,基于同名。频率是指年龄组在任何名称子集中出现的次数。例如,年龄组10=<在子集Dave中出现了两次。

代码语言:javascript
运行
复制
age | age_group |name  
----------------------
10     10=<       Dave
10     10=<       Dave
7      5-7        Dave
10     10=<       Jeff
8      8-9        Jeff
6      5-7        Jeff
1      0-1        Jeff
5      5-7        Carl
5      5-7        Carl
3      2-4        Carl
4      2-4        Sam
2      2-4        Sam
2      2-4        Sam

在SQL或VBA中可以这样做吗?我得到了第一个与之合作的:

代码语言:javascript
运行
复制
SELECT participants.name, participants.age_group, participants.age, *
FROM participants
ORDER BY participants.name, participants.age DESC;

但我完全迷上了第二步.如果你能帮我个忙就好了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-24 16:45:50

这种花哨的SQL将提供分组输出:

代码语言:javascript
运行
复制
SELECT 
    T3.age, T3.age_group, T3.name
FROM 
    Participants As T3
INNER JOIN

    (SELECT [age] * 1000 + Count(*) AS rating, T.name
    FROM participants AS T 
    INNER JOIN 

        (SELECT Max(participants.age) AS maxage, participants.name
        FROM participants
        GROUP BY participants.name) AS T2 

    ON (T.age = T2.maxage) AND (T.name = T2.name)
    GROUP BY T.name, T.age
    ORDER BY [age] * 1000 + Count(*) DESC) AS T4

ON T3.name = T4.name
ORDER BY T4.rating Desc, T3.age Desc

输出:

票数 2
EN

Stack Overflow用户

发布于 2020-02-24 15:56:35

试试这个:

代码语言:javascript
运行
复制
select p1.name, p2.age_group, p2.age
from participants as p1
left join (select name, age_group, count(1) as freq from participants group by name, age_group) as p2
on p1.name= p2.name and p1.age_group = p2.age_group
order by name,age, p2.freq desc

准入:

代码语言:javascript
运行
复制
select p1.name, p1.age_group, p1.age
from participants as p1
left join 

(select name, age_group, count(1) as freq 
from participants group by name, age_group) as p2

on p1.name= p2.name and p1.age_group = p2.age_group
order by p1.name, p1.age, p2.freq desc

存取输出:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60379133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档