Select 分组的最大日期?
Select max date by grouping?
请问有人帮忙吗?我已经将 HOURS 投入到这个愚蠢的问题中。 This stackoverview post 正是我的问题,我已经尝试了两种建议的解决方案都无济于事。
这是我的具体情况。我已经从我的实际数据库中提取了 4 条记录,并且没有排除任何字段:
master_id date_sent type mailing response
00001 2015-02-28 00:00:00 PHONE NULL NULL
00001 2015-03-13 14:45:20 EMAIL ThankYou.html NULL
00001 2015-03-13 14:34:43 EMAIL ThankYou.html NULL
00001 2015-01-11 00:00:00 EMAIL KS_PREVIEW TRUE
00001 2015-03-23 21:42:03 EMAIL MailChimp Update #2 NULL
(抱歉关于列的对齐方式。)
我想获取最近的邮件和每个 master_id 的 date_sent。 (我的摘录只有一个 master_id 使这个 post 简单。)
所以我 运行 这个查询:
SELECT master_id,date_sent,mailing
FROM contact_copy
WHERE type="EMAIL"
并得到预期的结果:
master_id date_sent mailing
1 3/13/2015 14:45:20 ThankYou.html
1 3/13/2015 14:34:43 ThankYou.html
1 1/11/2015 0:00:00 KS_PREVIEW
1 3/23/2015 21:42:03 MailChimp Update #2
但是,当我添加这个简单的聚合以获取最新日期时:
SELECT master_id,max(date_sent),mailing
FROM contact_copy
WHERE type="EMAIL"
group BY master_id
;
我得到了一个意外的结果:
master_id max(date_sent) mailing
00001 2015-03-23 21:42:03 ThankYou.html
所以我的问题是:为什么它会退回错误的邮件?
这让我抓狂!谢谢。
顺便说一句,我不是开发人员,如果我违反了一些提问的礼节规则,我深表歉意。 :)
那是因为当你使用 GROUP BY 时,所有的列都必须是聚合列,而邮件不是其中之一..
您应该使用子查询或联接来使其工作
SELECT master_id,date_sent,mailing
FROM contact_copy cc
JOIN
( SELECT master_id,max(date_sent)
FROM contact_copy
WHERE type="EMAIL"
group BY master_id
) result
ON cc.master_id= result.master_id AND cc.date_sent=result.date_sent
由于对 GROUP BY
功能的 MySQL 特定扩展,您得到了 "unexpected" 结果。根据 MySQL 参考手册,您得到的结果实际上是预期的。
参考:https://dev.mysql.com/doc/refman/5.5/en/group-by-handling.html
其他数据库引擎会以无效为由拒绝您的查询...类似“non-aggregate expressions included in the SELECT list not included in the GROUP BY
”的错误。)
如果我们在 SQL 模式中包含 ONLY_FULL_GROUP_BY
,我们可以让 MySQL 像其他数据库一样运行(并且 return 该查询的错误)。
参考:https://dev.mysql.com/doc/refman/5.5/en/sql-mode.html#sqlmode_only_full_group_by
要获得您正在寻找的结果...
如果 (master_id,type,date_sent)
元组在 contact_copy
中是唯一的(也就是说,如果 master_id
和 type
的给定值,将没有 "duplicate" 的值 date_sent
),我们可以使用 JOIN 操作来检索指定的结果。
首先,我们编写查询以获取给定 master_id
和 type
的 "maximum" date_sent
。例如:
SELECT mc.master_id
, mc.type
, MAX(mc.date_sent) AS max_date_sent
FROM contact_copy mc
WHERE mc.master_id = '0001'
AND mc.type = 'EMAIL'
要检索与 "maximum" date_sent
关联的整行,我们可以将该查询用作内联视图。也就是说,将查询文本包裹在括号中,分配一个别名,然后将其作为 table 引用,例如:
SELECT c.master_id
, c.date_sent
, c.mailing
FROM ( SELECT mc.master_id
, mc.type
, MAX(mc.date_sent) AS max_date_sent
FROM contact_copy mc
WHERE mc.master_id = '0001'
AND mc.type = 'EMAIL'
) m
JOIN contact_copy c
ON c.master_id = m.master_id
AND c.type = m.type
AND c.date_sent = m.max_date_sent
请注意,如果有多行具有相同的 master_id
、type
和 date_sent
值,则可能 return 不止一行。您可以添加一个 LIMIT 1
子句来保证您 return 只有一行;这些行中的哪一行是 returned 是不确定的,在 LIMIT 子句之前没有 ORDER BY
子句。
请问有人帮忙吗?我已经将 HOURS 投入到这个愚蠢的问题中。 This stackoverview post 正是我的问题,我已经尝试了两种建议的解决方案都无济于事。
这是我的具体情况。我已经从我的实际数据库中提取了 4 条记录,并且没有排除任何字段:
master_id date_sent type mailing response
00001 2015-02-28 00:00:00 PHONE NULL NULL
00001 2015-03-13 14:45:20 EMAIL ThankYou.html NULL
00001 2015-03-13 14:34:43 EMAIL ThankYou.html NULL
00001 2015-01-11 00:00:00 EMAIL KS_PREVIEW TRUE
00001 2015-03-23 21:42:03 EMAIL MailChimp Update #2 NULL
(抱歉关于列的对齐方式。)
我想获取最近的邮件和每个 master_id 的 date_sent。 (我的摘录只有一个 master_id 使这个 post 简单。)
所以我 运行 这个查询:
SELECT master_id,date_sent,mailing
FROM contact_copy
WHERE type="EMAIL"
并得到预期的结果:
master_id date_sent mailing
1 3/13/2015 14:45:20 ThankYou.html
1 3/13/2015 14:34:43 ThankYou.html
1 1/11/2015 0:00:00 KS_PREVIEW
1 3/23/2015 21:42:03 MailChimp Update #2
但是,当我添加这个简单的聚合以获取最新日期时:
SELECT master_id,max(date_sent),mailing
FROM contact_copy
WHERE type="EMAIL"
group BY master_id
;
我得到了一个意外的结果:
master_id max(date_sent) mailing
00001 2015-03-23 21:42:03 ThankYou.html
所以我的问题是:为什么它会退回错误的邮件?
这让我抓狂!谢谢。
顺便说一句,我不是开发人员,如果我违反了一些提问的礼节规则,我深表歉意。 :)
那是因为当你使用 GROUP BY 时,所有的列都必须是聚合列,而邮件不是其中之一..
您应该使用子查询或联接来使其工作
SELECT master_id,date_sent,mailing
FROM contact_copy cc
JOIN
( SELECT master_id,max(date_sent)
FROM contact_copy
WHERE type="EMAIL"
group BY master_id
) result
ON cc.master_id= result.master_id AND cc.date_sent=result.date_sent
由于对 GROUP BY
功能的 MySQL 特定扩展,您得到了 "unexpected" 结果。根据 MySQL 参考手册,您得到的结果实际上是预期的。
参考:https://dev.mysql.com/doc/refman/5.5/en/group-by-handling.html
其他数据库引擎会以无效为由拒绝您的查询...类似“non-aggregate expressions included in the SELECT list not included in the GROUP BY
”的错误。)
如果我们在 SQL 模式中包含 ONLY_FULL_GROUP_BY
,我们可以让 MySQL 像其他数据库一样运行(并且 return 该查询的错误)。
参考:https://dev.mysql.com/doc/refman/5.5/en/sql-mode.html#sqlmode_only_full_group_by
要获得您正在寻找的结果...
如果 (master_id,type,date_sent)
元组在 contact_copy
中是唯一的(也就是说,如果 master_id
和 type
的给定值,将没有 "duplicate" 的值 date_sent
),我们可以使用 JOIN 操作来检索指定的结果。
首先,我们编写查询以获取给定 master_id
和 type
的 "maximum" date_sent
。例如:
SELECT mc.master_id
, mc.type
, MAX(mc.date_sent) AS max_date_sent
FROM contact_copy mc
WHERE mc.master_id = '0001'
AND mc.type = 'EMAIL'
要检索与 "maximum" date_sent
关联的整行,我们可以将该查询用作内联视图。也就是说,将查询文本包裹在括号中,分配一个别名,然后将其作为 table 引用,例如:
SELECT c.master_id
, c.date_sent
, c.mailing
FROM ( SELECT mc.master_id
, mc.type
, MAX(mc.date_sent) AS max_date_sent
FROM contact_copy mc
WHERE mc.master_id = '0001'
AND mc.type = 'EMAIL'
) m
JOIN contact_copy c
ON c.master_id = m.master_id
AND c.type = m.type
AND c.date_sent = m.max_date_sent
请注意,如果有多行具有相同的 master_id
、type
和 date_sent
值,则可能 return 不止一行。您可以添加一个 LIMIT 1
子句来保证您 return 只有一行;这些行中的哪一行是 returned 是不确定的,在 LIMIT 子句之前没有 ORDER BY
子句。