MySQL使用GROUPBY从同一行中提取其他varchar字段
我有一个如下结构的事务表:MySQL使用GROUPBY从同一行中提取其他varchar字段,mysql,Mysql,我有一个如下结构的事务表: +--------------------------------------+--------------------------+------------+ | contact_id | return_reason | date | +--------------------------------------+--------------------------+-------
+--------------------------------------+--------------------------+------------+
| contact_id | return_reason | date |
+--------------------------------------+--------------------------+------------+
| 2091c2ed-8f9b-bcfe-1884-50d3ab2cd02d | R01 - Insufficient Funds | 2014-01-25 |
| 2091c2ed-8f9b-bcfe-1884-50d3ab2cd02d | R08 - Payment Stopped | 2013-09-15 |
| 2091c2ed-8f9b-bcfe-1884-50d3ab2cd02d | R01 - Insufficient Funds | 2013-08-15 |
| 2091c2ed-8f9b-bcfe-1884-50d3ab2cd02d | R01 - Insufficient Funds | 2013-07-31 |
| 2091c2ed-8f9b-bcfe-1884-50d3ab2cd02d | R01 - Insufficient Funds | 2013-05-31 |
| 10101a4f-eaf8-b05a-4813-51a682df2189 | R08 - Payment Stopped | 2013-03-15 |
| 10101a4f-eaf8-b05a-4813-51a682df2189 | R08 - Payment Stopped | 2013-04-15 |
| 10101a4f-eaf8-b05a-4813-51a682df2189 | R08 - Payment Stopped | 2013-05-15 |
+--------------------------------------+--------------------------+------------+
我要查找的数据是每个联系人id的最新返回原因
我目前的问题是:
从交易组中按联系人id顺序按ram日期描述选择联系人id,返回原因为最近返回原因,最大(日期)为ram日期代码>
我的查询结果得出了正确的返回原因,但我不确定它是否这样做,因为它是准确的/正确的,如果它是因为可能性对我有利。恐怕是因为这个非常相似的查询提取了错误的日期值:
从交易组中按联系人id顺序按ram日期描述选择联系人id,返回原因为最近返回原因,日期为ram日期代码>你说的“可能性”对你有利是对的。此查询在大多数其他DBMS中都无效,因为“return\u reason”既不在group by子句中,也不在聚合函数中,但MySQL的权限更大,允许您运行它。结果是未定义的
您需要的是聚合函数FIRST()和LAST(),可惜MySQL中不存在这两个函数
解决方案:您可以使用GROUP_CONCAT()执行您想要执行的操作。查看文档以了解其工作原理:你说的“可能性”对你有利是对的。此查询在大多数其他DBMS中都无效,因为“return\u reason”既不在group by子句中,也不在聚合函数中,但MySQL的权限更大,允许您运行它。结果是未定义的
您需要的是聚合函数FIRST()和LAST(),可惜MySQL中不存在这两个函数
解决方案:您可以使用GROUP_CONCAT()执行您想要执行的操作。查看文档以了解其工作原理:你说的“可能性”对你有利是对的。此查询在大多数其他DBMS中都无效,因为“return\u reason”既不在group by子句中,也不在聚合函数中,但MySQL的权限更大,允许您运行它。结果是未定义的
您需要的是聚合函数FIRST()和LAST(),可惜MySQL中不存在这两个函数
解决方案:您可以使用GROUP_CONCAT()执行您想要执行的操作。查看文档以了解其工作原理:你说的“可能性”对你有利是对的。此查询在大多数其他DBMS中都无效,因为“return\u reason”既不在group by子句中,也不在聚合函数中,但MySQL的权限更大,允许您运行它。结果是未定义的
您需要的是聚合函数FIRST()和LAST(),可惜MySQL中不存在这两个函数
解决方案:您可以使用GROUP_CONCAT()执行您想要执行的操作。查看文档以了解它是如何工作的:正如Fabien所提到的,您很幸运,因为您使用的是对groupby
节点的MySQL扩展。如文件所述,select
中不在groupby
中且没有聚合函数的列是从任意行分配的值。这意味着return\u reason
来自任意行,而不是具有最大日期的行
下面是一个非常简单的方法来获取最新的原因:
select contact_id,
substring_index(group_concat(return_reason order by date desc), ',', 1
) as most_recent_return_reason,
max(date) as ram_date
from transactions
group by contact_id
order by ram_date desc;
正如Fabien所提到的,您很幸运,因为您使用的是对groupby
节点的MySQL扩展。如文件所述,select
中不在groupby
中且没有聚合函数的列是从任意行分配的值。这意味着return\u reason
来自任意行,而不是具有最大日期的行
下面是一个非常简单的方法来获取最新的原因:
select contact_id,
substring_index(group_concat(return_reason order by date desc), ',', 1
) as most_recent_return_reason,
max(date) as ram_date
from transactions
group by contact_id
order by ram_date desc;
正如Fabien所提到的,您很幸运,因为您使用的是对groupby
节点的MySQL扩展。如文件所述,select
中不在groupby
中且没有聚合函数的列是从任意行分配的值。这意味着return\u reason
来自任意行,而不是具有最大日期的行
下面是一个非常简单的方法来获取最新的原因:
select contact_id,
substring_index(group_concat(return_reason order by date desc), ',', 1
) as most_recent_return_reason,
max(date) as ram_date
from transactions
group by contact_id
order by ram_date desc;
正如Fabien所提到的,您很幸运,因为您使用的是对groupby
节点的MySQL扩展。如文件所述,select
中不在groupby
中且没有聚合函数的列是从任意行分配的值。这意味着return\u reason
来自任意行,而不是具有最大日期的行
下面是一个非常简单的方法来获取最新的原因:
select contact_id,
substring_index(group_concat(return_reason order by date desc), ',', 1
) as most_recent_return_reason,
max(date) as ram_date
from transactions
group by contact_id
order by ram_date desc;
事实上,select中的MAX运算符是结果的格式化程序,而不是应用于结果的运算符
你可以这样做
SELECT contact_id,return_reason AS most_recent_return_reason, date AS ram_date
FROM transactions AS t
WHERE t.date = (
SELECT MAX(t2.date)
FROM transactions AS t2
WHERE t2.contact_id = t.contact_id
);
此外,您可以在此SQL FIDLE上看到差异:事实上,select中的MAX运算符是结果的格式化程序,而不是应用于结果的运算符
你可以这样做
SELECT contact_id,return_reason AS most_recent_return_reason, date AS ram_date
FROM transactions AS t
WHERE t.date = (
SELECT MAX(t2.date)
FROM transactions AS t2
WHERE t2.contact_id = t.contact_id
);
此外,您可以在此SQL FIDLE上看到差异:事实上,select中的MAX运算符是结果的格式化程序,而不是应用于结果的运算符
你可以这样做
SELECT contact_id,return_reason AS most_recent_return_reason, date AS ram_date
FROM transactions AS t
WHERE t.date = (
SELECT MAX(t2.date)
FROM transactions AS t2
WHERE t2.contact_id = t.contact_id
);
此外,您可以在此SQL FIDLE上看到差异:事实上,select中的MAX运算符是结果的格式化程序,而不是应用于结果的运算符
你可以这样做
SELECT contact_id,return_reason AS most_recent_return_reason, date AS ram_date
FROM transactions AS t
WHERE t.date = (
SELECT MAX(t2.date)
FROM transactions AS t2
WHERE t2.contact_id = t.contact_id
);
此外,您可以在这个SQL小提琴上看到差异:多亏了all。GROUP_CONCAT似乎对我有用,@GordonLinoff也因为包含了快速子字符串索引语法而获得了加分。谢谢大家。GROUP_CONCAT似乎对我有用,@GordonLinoff也因为包含了快速子字符串索引语法而获得了加分。谢谢大家。CONCAT小组似乎在为我工作,@GordonLinoff因为加入了qu而获得了加分