Группировка и упорядочение по значению, алфавиту и частоте на основе общего значения - PullRequest
0 голосов
/ 24 февраля 2020

Итак, я работаю с MS Access и у меня есть этот список участников с тремя столбцами age, name и age_group, и я хочу, чтобы он сначала упорядочивался по имени, а затем по возрасту, а также по частоте age_group на основе того же имени. Например:

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

Сначала это будет выглядеть так, упорядочено по имени и по возрасту

----------------------
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 = <присутствует два раза в подмножестве Дейва. </p>

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? Я заставляю первого работать с:

SELECT participants.name, participants.age_group, participants.age, *
FROM participants
ORDER BY participants.name, participants.age DESC;

Но я совершенно потерян в выполнении второго шага ... Буду признателен, если вы поможете мне.

Ответы [ 2 ]

2 голосов
/ 24 февраля 2020

Эта фантазия SQL обеспечит сгруппированный вывод:

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

Выход:

enter image description here

1 голос
/ 24 февраля 2020

Попробуйте:

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

Доступ:

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

Выход доступа:

Access

...