mysql - 希望通过结合最大(或最小)对组进行一些澄清

标签 mysql group-by max

我有一个用户数据点表,我正在尝试使用分组依据、最小值和个案来调整它。

所以..

用户数据:

user_id | data_type_id | value
1       |    1         |    'Joe'
1       |    2         |    'Blow'
2       |    1         |    'Mary'
2       |    2         |    'Jones'


select 
max( case when data_type_id = 1 then value end) as 'firstName',
max( case when data_type_id = 2 then value end) as 'lastName' 

from user_data group by user_id

这种'a sort'a 有效,除了通常值是 NULL,即使如果我删除分组依据和最大值,数据集中*存在这些数据类型的值。

我试图了解幕后发生的事情,因为它非常令人困惑。 group by 看起来每个用户只有一行(我不确定它是如何决定哪一行的……可能是第一行?)但是 case 语句以某种方式设法找到了信息对于未显示的行。

如果能帮助我理解这里发生的事情,我将非常感激,这样我就可以获得我实际正在寻找的数据。

最佳答案

您要做的是将行 (data_type_id) 转置为列。当你执行下面的语句时,

SELECT user_id,
       CASE WHEN data_type_id = 1 THEN value END  firstName,
       CASE WHEN data_type_id = 2 THEN value END  lastName 
FROM   TableName 

它会给你下面的结果,

╔═════════╦═══════════╦══════════╗
║ USER_ID ║ FIRSTNAME ║ LASTNAME ║
╠═════════╬═══════════╬══════════╣
║       1 ║ Joe       ║ (null)   ║
║       1 ║ (null)    ║ Blow     ║
║       2 ║ Mary      ║ (null)   ║
║       2 ║ (null)    ║ Jones    ║
╚═════════╩═══════════╩══════════╝

请注意,当它不满足 CASE 语句中的条件时,该值为 (null)

为了将 user_id 归类到每一组的一行中并消除那些 null 值,聚合函数 MAX() 应用于行:firstnamelastname

SELECT user_id,
       MAX(CASE WHEN data_type_id = 1 THEN value END)  firstName,
       MAX(CASE WHEN data_type_id = 2 THEN value END)  lastName 
FROM   TableName 
GROUP  BY user_id

因此给你以下结果,

╔═════════╦═══════════╦══════════╗
║ USER_ID ║ FIRSTNAME ║ LASTNAME ║
╠═════════╬═══════════╬══════════╣
║       1 ║ Joe       ║ Blow     ║
║       2 ║ Mary      ║ Jones    ║
╚═════════╩═══════════╩══════════╝

关于mysql - 希望通过结合最大(或最小)对组进行一些澄清,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19340853/

相关文章:

mysql - 如何将一个表中存在重复值的数据合并到一行中?

php - 需要一天中的最长和最短时间

arrays - 如何确定数组中最大值的位置?

r - 如何计算在收到阳性结果之前阴性观察的数量

php - 使用 XMLReader 读取大于 1GB 的文件时出现问题

mysql - 从其他表传输数据并将字段名称设置为值

mysql - 从表中选择所有行并为每行连接表中的匹配行

php - 每天显示记录

mysql - 使用外键在表中插入数据库

sql - oracle - 为每两种类型获取最高值