Mysql
按年齡範圍和性別分組,在某些列上具有聚合功能
在 Mysql 中,我有一個帶有 id、birth_year 和性別的患者表。下一張表是我有 id,patent_id 的交易
$$ FK from patient $$和檢查日期。我需要選擇行,以便獲得年齡範圍內所有男性和女性的檢查次數。 如何查詢以實現以下表格結果?
20歲以下,男:10次,女:15次
21-30歲,男:20次,女:35次
31-40歲,男:30次,女:45次
…. ……. ……… ……. …….. ……….
81-90,男:10次,女:6次
90歲以上,男性:0次,女性:4次
謝謝你。
兩種選擇。
a) 使用子查詢
select concat(10*floor(age/10), '-', 10*floor(age/10) + 10) as `range`, gender, count(*) as count from ( select *, TIMESTAMPDIFF(YEAR,birth_year,CURDATE()) AS age from transaction left join patient on patient_id = patient.id ) as t group by `range`, gender;
給
+-------+--------+-------+ | range | gender | count | +-------+--------+-------+ | 0-10 | m | 2 | | 10-20 | m | 1 | | 20-30 | m | 3 | | 30-40 | f | 2 | | 30-40 | m | 2 | | 50-60 | f | 1 | | 50-60 | m | 1 | | 60-70 | f | 5 | | 60-70 | m | 3 | | 70-80 | f | 1 | | 70-80 | m | 6 | +-------+--------+-------+
b) 先按年齡分組,再按應用範圍分組。
使用 ORM 時,進行子查詢並不容易,所以這可能是個好主意。
性能方面:考慮到人類的平均壽命為 100 年,最多可以有 200 條記錄(100 條男性和 100 條女性),可以在應用程序中輕鬆循環。
select gender, TIMESTAMPDIFF(YEAR,birth_year,CURDATE()) AS age, count(*) from transaction left join patient on patient_id = patient.id group by age, gender
給
+--------+------+----------+ | gender | age | count(*) | +--------+------+----------+ | m | 4 | 2 | | m | 14 | 1 | | m | 24 | 3 | | f | 34 | 2 | | m | 34 | 2 | | f | 54 | 1 | | m | 54 | 1 | | f | 64 | 5 | | m | 64 | 3 | | f | 74 | 1 | | m | 74 | 6 | +--------+------+----------+