求教一个mysql的查询语句写法,在用户自定义的标签里选出出现频率最高的3个

求教一个mysql的查询语句写法,在用户自定义的标签里选出出现频率最高的3个,第1张

SELECT

count(a.id) as  num ,

substring_index( substring_index( a.sign, ',', b.help_topic_id + 1 ), ',',- 1 ) AS a_sign

FROM

`album` AS a

JOIN mysql.help_topic b ON b.help_topic_id < ( length( a.sign ) - length( REPLACE ( a.sign, ',', '' ) ) + 1 )

group by a_sign  order by num desc limit 3

注意

1、mysql帐号要有help_topic表的 *** 作权限

2、当两个词出现次数同样时,先出现的会排在前面

3、group by 后面的 a_sign要与第三行 as后面的a_sign保持同样的字段名 且与不一样原本的字段名不一样,,如果想要用同样的字段名,用下面的sql语句

SELECT

sign,

count( * )  as num

FROM

(

SELECT

substring_index( substring_index( a.sign, ',', b.help_topic_id + 1 ), ',',- 1 ) AS sign

FROM

`album` AS a

JOIN mysql.help_topic b ON b.help_topic_id < ( length( a.sign ) - length( REPLACE ( a.sign, ',', '' ) ) + 1 )

) AS a

GROUP BY

sign  order by num desc limit 3

财年是一个公司的上市时间决定的,所以不同的公司财年码表不同,因为我目前用的财年是从4月1号开始算的,自己就写了个mysql 的工具函数:

SELECT

-- 自然日

naturalday,

-- 财年

concat('FY', DATE_FORMAT(naturalday,'%y'),  DATE_FORMAT(naturalday,'%y')+1) as fiscalyear,

-- 财季

concat('Q', case when QUARTER(naturalday)=4 then 1 ELSE QUARTER(naturalday)-1 END

) as fiscalquarter,

-- 财月

DATE_FORMAT(naturalday,'%m') as fiscalmonth,

-- 财周

timestampdiff(WEEK,date(concat(year(naturalday),'-',elt(quarter(naturalday),1,4,7,10),'-',1)),naturalday) as fiscalweek

from tool_lenovo_day

一下是我写的一个存储过程:

CREATE DEFINER=`root`@`%` PROCEDURE `sp_InitialFiscalYear_data`(`sDate` varchar(20),`eDate` varchar(20))

BEGIN

/*

工具函数:生成时间段内的lenovo的财年、财季、财月、财周数据

做成:白纸黑字

做成日:2020-07-16

入参:

sDate 开始自然日

eDate 结束自然日

业务逻辑:

tool_lenovo_day 财年表

有更新、没有新增财年数据

*/

INSERT INTO tool_lenovo_day SELECT

*

FROM

(

SELECT

naturalday,

concat( 'FY', DATE_FORMAT( naturalday, '%y' ), DATE_FORMAT( naturalday, '%y' )+ 1 ) AS fiscalyear,

concat( 'Q', CASE WHEN QUARTER ( naturalday )= 4 THEN 1 ELSE QUARTER ( naturalday )- 1 END ) AS fiscalquarter,

DATE_FORMAT( naturalday, '%m' ) AS fiscalmonth,

timestampdiff(

WEEK,

date(

concat( YEAR ( naturalday ), '-', elt( QUARTER ( naturalday ), 1, 4, 7, 10 ), '-', 1 )),

naturalday

)+1 AS fiscalweek

FROM

(

SELECT

date_add( date_sub(sDate,interval 1 day), INTERVAL ( cast( help_topic_id AS signed INTEGER ) + 1 ) day ) naturalday

FROM

mysql.help_topic

WHERE

help_topic_id <DATEDIFF(eDate,date_sub(sDate,interval 1 day))

ORDER BY

help_topic_id

) as s_e_day

) AS a

ON DUPLICATE KEY UPDATE fiscalyear = a.fiscalyear,

fiscalquarter = a.fiscalquarter,

fiscalmonth = a.fiscalmonth,

fiscalweek = a.fiscalweek

END

处理数据时,遇到了需要将一行数据变成多行数据的情况

如下图数据

需要将数据处理成

在这里我们需要用到mysql函数SUBSTRING_INDEX和mysql表mysql.help_topic

substring_index(str,delim,count)

通过如下语句,则可实现一行转多行,最终实现上图的效果


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/7669596.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-08
下一篇 2023-04-08

发表评论

登录后才能评论

评论列表(0条)

保存