如何在 mysql 中创建程序
How to create procedure in mysql
我正在 mysql 中创建一个过程,但我遇到了所需结果的问题,现在我一团糟。请帮助我!
要求是这样的:
从 table 中获取当天的前 20 个条目。对于前 20 个条目,它们应该是一天中出现频率最高的条目——如果可能的话。 - 如果发现的错误发生在过去 30 天内,请显示它在过去 30 天内出现的次数,以及错误首次出现的日期。例如 - 应用程序 1 在今天发生了一条错误消息“连接时出错”。但是,它在过去 30 天内也发生过此错误,发生次数超过 5 次。计数应显示为 6(当前出现和前 5 次出现)。错误首次出现的日期也应该显示出来。输出应如下所示 - 按列名称: - 应用程序名称 - 错误消息 - 计数 - 错误消息在过去 30 天内出现的次数,对于“应用程序名称”和“错误消息”的唯一键 - 日期 -此错误首次出现的日期,对于“应用程序名称”和“错误消息”的唯一键
我的 table 看起来像这样:
到目前为止,我已经创建了以下程序:
CREATE PROCEDURE ExpectedResult()
BEGIN
SELECT log_id, app_name, error_message, error_date, count(error_message)
FROM app_log WHERE error_date < '2021-03-14' -- CURDATE()
group by app_name, error_message;
END$$
DELIMITER ;
重建数据需要更多时间,编写一个简单的sql查询
CREATE TABLE app_log (
`LOG_ID` INTEGER,
`APP_NAME` VARCHAR(5),
`ERROR-MESSAGE` VARCHAR(34),
`ERROR-DATE` VARCHAR(10)
);
INSERT INTO app_log
(`LOG_ID`, `APP_NAME`, `ERROR-MESSAGE`, `ERROR-DATE`)
VALUES
('1', 'APP_1', 'UNABLE TO CONNECT - 101', '2021-03-14'),
('2', 'APP_1', 'UNABLE TO CONNECT - 101', '2021-03-01'),
('3', 'APP_1', 'UNABLE TO CONNECT - 101', '2021-01-01'),
('4', 'APP_1', 'UNABLE TO CONNECT - 102', '2021-03-14'),
('5', 'APP_1', 'UNABLE TO CONNECT - 102', '2021-01-01'),
('6', 'APP_1', 'UNABLE TO CONNECT - SERVER ERROR', '2021-03-14'),
('7', 'APP_1', 'UNABLE TOCONNECT -102', '2020-01-01'),
('8', 'APP_2', 'SERVER ERROR 1', '2021-03-14'),
('9', 'APP_2', 'SERVER ERROR 1', '2021-03-01'),
('10', 'APP_2', 'SERVER ERROR 1', '2021-01-01'),
('11', 'APP_2', 'SERVER ERROR 2', '2021-03-14'),
('12', 'APP_2', 'SERVER ERROR 2', '2020-01-01'),
('13', 'APP_2', 'PROXY ERROR', '2021-03-14'),
('14', 'APP_3', 'SERVER UNAVAILABLE', '2021-03-14'),
('15', 'APP_3', 'SERVER UNAVAILABLE', '2021-03-01'),
('16', 'APP_3', 'SERVER UNAVAILABLE', '2021-01-01');
SELECT MAX(LOG_ID), APP_NAME, `ERROR-MESSAGE`, MAX(`ERROR-DATE`), count(`ERROR-MESSAGE`) count_messages
FROM app_log WHERE `ERROR-DATE` >= CURDATE() - iNTERVAL 30 daY
group by APP_NAME, `ERROR-MESSAGE`
ORDEr BY count_messages DESC
LIMIT 20;
MAX(LOG_ID) | APP_NAME | ERROR-MESSAGE | MAX(`ERROR-DATE`) | count_messages
----------: | :------- | :------------------------------- | :---------------- | -------------:
9 | APP_2 | SERVER ERROR 1 | 2021-03-14 | 2
15 | APP_3 | SERVER UNAVAILABLE | 2021-03-14 | 2
1 | APP_1 | UNABLE TO CONNECT - 101 | 2021-03-14 | 1
2 | APP_1 | UNABLE TO CONNECT - 101 | 2021-03-01 | 1
4 | APP_1 | UNABLE TO CONNECT - 102 | 2021-03-14 | 1
6 | APP_1 | UNABLE TO CONNECT - SERVER ERROR | 2021-03-14 | 1
11 | APP_2 | SERVER ERROR 2 | 2021-03-14 | 1
13 | APP_2 | PROXY ERROR | 2021-03-14 | 1
db<>fiddle here
我正在 mysql 中创建一个过程,但我遇到了所需结果的问题,现在我一团糟。请帮助我!
要求是这样的:
从 table 中获取当天的前 20 个条目。对于前 20 个条目,它们应该是一天中出现频率最高的条目——如果可能的话。 - 如果发现的错误发生在过去 30 天内,请显示它在过去 30 天内出现的次数,以及错误首次出现的日期。例如 - 应用程序 1 在今天发生了一条错误消息“连接时出错”。但是,它在过去 30 天内也发生过此错误,发生次数超过 5 次。计数应显示为 6(当前出现和前 5 次出现)。错误首次出现的日期也应该显示出来。输出应如下所示 - 按列名称: - 应用程序名称 - 错误消息 - 计数 - 错误消息在过去 30 天内出现的次数,对于“应用程序名称”和“错误消息”的唯一键 - 日期 -此错误首次出现的日期,对于“应用程序名称”和“错误消息”的唯一键
我的 table 看起来像这样:
到目前为止,我已经创建了以下程序:
CREATE PROCEDURE ExpectedResult()
BEGIN
SELECT log_id, app_name, error_message, error_date, count(error_message)
FROM app_log WHERE error_date < '2021-03-14' -- CURDATE()
group by app_name, error_message;
END$$
DELIMITER ;
重建数据需要更多时间,编写一个简单的sql查询
CREATE TABLE app_log ( `LOG_ID` INTEGER, `APP_NAME` VARCHAR(5), `ERROR-MESSAGE` VARCHAR(34), `ERROR-DATE` VARCHAR(10) ); INSERT INTO app_log (`LOG_ID`, `APP_NAME`, `ERROR-MESSAGE`, `ERROR-DATE`) VALUES ('1', 'APP_1', 'UNABLE TO CONNECT - 101', '2021-03-14'), ('2', 'APP_1', 'UNABLE TO CONNECT - 101', '2021-03-01'), ('3', 'APP_1', 'UNABLE TO CONNECT - 101', '2021-01-01'), ('4', 'APP_1', 'UNABLE TO CONNECT - 102', '2021-03-14'), ('5', 'APP_1', 'UNABLE TO CONNECT - 102', '2021-01-01'), ('6', 'APP_1', 'UNABLE TO CONNECT - SERVER ERROR', '2021-03-14'), ('7', 'APP_1', 'UNABLE TOCONNECT -102', '2020-01-01'), ('8', 'APP_2', 'SERVER ERROR 1', '2021-03-14'), ('9', 'APP_2', 'SERVER ERROR 1', '2021-03-01'), ('10', 'APP_2', 'SERVER ERROR 1', '2021-01-01'), ('11', 'APP_2', 'SERVER ERROR 2', '2021-03-14'), ('12', 'APP_2', 'SERVER ERROR 2', '2020-01-01'), ('13', 'APP_2', 'PROXY ERROR', '2021-03-14'), ('14', 'APP_3', 'SERVER UNAVAILABLE', '2021-03-14'), ('15', 'APP_3', 'SERVER UNAVAILABLE', '2021-03-01'), ('16', 'APP_3', 'SERVER UNAVAILABLE', '2021-01-01');
SELECT MAX(LOG_ID), APP_NAME, `ERROR-MESSAGE`, MAX(`ERROR-DATE`), count(`ERROR-MESSAGE`) count_messages FROM app_log WHERE `ERROR-DATE` >= CURDATE() - iNTERVAL 30 daY group by APP_NAME, `ERROR-MESSAGE` ORDEr BY count_messages DESC LIMIT 20;
MAX(LOG_ID) | APP_NAME | ERROR-MESSAGE | MAX(`ERROR-DATE`) | count_messages ----------: | :------- | :------------------------------- | :---------------- | -------------: 9 | APP_2 | SERVER ERROR 1 | 2021-03-14 | 2 15 | APP_3 | SERVER UNAVAILABLE | 2021-03-14 | 2 1 | APP_1 | UNABLE TO CONNECT - 101 | 2021-03-14 | 1 2 | APP_1 | UNABLE TO CONNECT - 101 | 2021-03-01 | 1 4 | APP_1 | UNABLE TO CONNECT - 102 | 2021-03-14 | 1 6 | APP_1 | UNABLE TO CONNECT - SERVER ERROR | 2021-03-14 | 1 11 | APP_2 | SERVER ERROR 2 | 2021-03-14 | 1 13 | APP_2 | PROXY ERROR | 2021-03-14 | 1
db<>fiddle here