Mysql 如何选择最后记录sql的第n行?
我遇到了这样一种情况,我必须显示前9行的域名电子邮件和电子邮件的出现次数,第10行作为剩余域的总和,并显示为其他域 我所做的一切 我已经使用下面的查询成功地获取了不同的域及其出现的情况Mysql 如何选择最后记录sql的第n行?,mysql,sql,Mysql,Sql,我遇到了这样一种情况,我必须显示前9行的域名电子邮件和电子邮件的出现次数,第10行作为剩余域的总和,并显示为其他域 我所做的一切 我已经使用下面的查询成功地获取了不同的域及其出现的情况 SELECT (SUBSTRING_INDEX(SUBSTR(email, INSTR(email, '@') + 1),'.',1)) as domain, COUNT(*) as C FROM newsletter_recipient where LENGTH(email) > 0 GRO
SELECT (SUBSTRING_INDEX(SUBSTR(email, INSTR(email, '@') + 1),'.',1)) as domain,
COUNT(*) as C
FROM newsletter_recipient
where LENGTH(email) > 0
GROUP BY (SUBSTRING_INDEX(SUBSTR(email, INSTR(email, '@') + 1),'.',1))
ORDER BY COUNT(*) DESC
当前结果
domain C
------------------------
gmail 12
dddd 2
mmmmm 2
dsf 2
aaaa 1
bbbb 1
ccc 1
yopmail 1
yahoo 1
dde 1
rfg 1
eedd 1
dfdg 1
sad 1
dfdf 1
sfd 1
web 1
预期结果
domain C
------------------------
gmail 12
dddd 2
mmmmm 2
dsf 2
aaaa 1
bbbb 1
ccc 1
yopmail 1
yahoo 1
others 8
希望有人能帮忙表达时使用一个case-
使用两个聚合级别:
SELECT (CASE WHEN seqnum < 10 THEN domain ELSE 'Others' END) as domain,
SUM(c)
FROM (SELECT SUBSTRING_INDEX(SUBSTR(email, INSTR(email, '@') + 1), '.', 1) as domain,
COUNT(*) as C,
ROW_NUMBER() OVER (ORDER BY COUNT(*) DESC) as seqnum
FROM newsletter_recipient
WHERE LENGTH(email) > 0
GROUP BY domain
) d
GROUP BY (CASE WHEN seqnum < 10 THEN domain ELSE 'Others' END)
ORDER BY SUM(c) DESC;
你可以试试下面的方法
WITH cte AS (
SELECT (SUBSTRING_INDEX(SUBSTR(email, INSTR(email, '@') + 1),'.',1)) as domain,
COUNT(*) as C
FROM newsletter_recipient
WHERE LENGTH(email) > 0
GROUP BY (SUBSTRING_INDEX(SUBSTR(email, INSTR(email, '@') + 1),'.',1))
ORDER BY COUNT(*) DESC
)
SELECT
IF(rn < 10, domain, 'others') AS domain_name,
SUM(c) AS count
FROM (
SELECT domain, c, ROW_NUMBER() OVER () AS rn FROM cte
) T
GROUP BY domain_name
我会先通过10+个工会来解决这个问题:
SELECT * from (
SELECT
(SUBSTRING_INDEX(SUBSTR(email, INSTR(email, '@') + 1),
'.',
1)) AS domain,
COUNT(*) AS C
FROM
newsletter_recipient
WHERE
LENGTH(email) > 0
GROUP BY (SUBSTRING_INDEX(SUBSTR(email, INSTR(email, '@') + 1),
'.',
1))
ORDER BY COUNT(*) DESC
Limit 10) as FIRST_10
UNION
SELECT 'others', sum(ALL_OTHERS.C) from (
SELECT
COUNT(*) AS C
FROM
newsletter_recipient
WHERE
LENGTH(email) > 0
GROUP BY (SUBSTRING_INDEX(SUBSTR(email, INSTR(email, '@') + 1),
'.',
1))
ORDER BY COUNT(*) DESC
Limit 11,18446744073709551615
) as ALL_OTHERS
18446744073709551615:足够大,可以跳过前10个并确保检索到所有其他邮件,请参阅:ohh..我不能在not in中硬编码邮件客户端,因为它们是动态的:-
SELECT * from (
SELECT
(SUBSTRING_INDEX(SUBSTR(email, INSTR(email, '@') + 1),
'.',
1)) AS domain,
COUNT(*) AS C
FROM
newsletter_recipient
WHERE
LENGTH(email) > 0
GROUP BY (SUBSTRING_INDEX(SUBSTR(email, INSTR(email, '@') + 1),
'.',
1))
ORDER BY COUNT(*) DESC
Limit 10) as FIRST_10
UNION
SELECT 'others', sum(ALL_OTHERS.C) from (
SELECT
COUNT(*) AS C
FROM
newsletter_recipient
WHERE
LENGTH(email) > 0
GROUP BY (SUBSTRING_INDEX(SUBSTR(email, INSTR(email, '@') + 1),
'.',
1))
ORDER BY COUNT(*) DESC
Limit 11,18446744073709551615
) as ALL_OTHERS