Credentials Manager 活动分析

Credentials Manager Activity Analysis

提问人:Jonathan Edward 提问时间:11/17/2023 最后编辑:jarlhJonathan Edward 更新时间:11/17/2023 访问量:26

问:

结果应包含以下列:mac/type/started_at/ended_at/activities mac 帐户 MAC 地址 类型-序列活动类型 序列开始started_at日期和时间 ended_at日期和时间序列结束 activities-序列中的活动数

问题 结果应按 mac 升序排序,然后按 started_at 升序排序

结果中只应包含 3 个或更多个连续错误类型操作的序列。下表已经是原始数据。

DROP TABLE IF EXISTS accounts;
DROP TABLE IF EXISTS activities;

-- create accounts table
CREATE TABLE accounts (
  id INTEGER PRIMARY KEY,
  mac INTEGER NOT NULL
);

-- create activities table
CREATE TABLE activities (
  account_id INTEGER NOT NULL,
  dt INTEGER NOT NULL,
  type INTEGER NOT NULL, 
  FOREIGN KEY (account_id) REFERENCES accounts(id)
);
-- insert some accounts values
INSERT INTO accounts VALUES (1, 'C4-85-20-F3-E9-CD');
INSERT INTO accounts VALUES (2, 'CB-5D-05-EE-05-97');
INSERT INTO accounts VALUES (3, '5C-40-A9-D4-25-77');

-- insert some activities values
INSERT INTO activities VALUES (1, 10, 'SUCCESS');
INSERT INTO activities VALUES (1, 11, 'ERROR');
INSERT INTO activities VALUES (1, 12, 'ERROR');
INSERT INTO activities VALUES (1, 13, 'ERROR');
INSERT INTO activities VALUES (1, 14, 'ERROR');
INSERT INTO activities VALUES (1, 15, 'SUCCESS');
INSERT INTO activities VALUES (1, 16, 'ERROR');
INSERT INTO activities VALUES (1, 17, 'ERROR');
INSERT INTO activities VALUES (1, 18, 'ERROR');
INSERT INTO activities VALUES (1, 19, 'SUCCESS');
INSERT INTO activities VALUES (2, 10, 'ERROR');
INSERT INTO activities VALUES (2, 11, 'ERROR');
INSERT INTO activities VALUES (2, 12, 'ERROR');
INSERT INTO activities VALUES (2, 13, 'SUCCESS');
INSERT INTO activities VALUES (2, 14, 'SUCCESS');
INSERT INTO activities VALUES (2, 15, 'SUCCESS');
INSERT INTO activities VALUES (3, 11, 'ERROR');
INSERT INTO activities VALUES (3, 12, 'ERROR');
INSERT INTO activities VALUES (3, 13, 'SUCCESS');
INSERT INTO activities VALUES (3, 14, 'SUCCESS');


SELECT "account_id", COUNT(*), min("dt"), max("dt") FROM activities WHERE type = 'ERROR' 
GROUP BY "account_id" 

预期成果:

MAC                 | TYPE | started_at |  ended_at |   total_activities 
C4-85-20-F3-E9-CD | ERROR | 11         | 14        | 4
SQL格式

评论

2赞 nbk 11/17/2023
你的问题是?
0赞 nbk 11/17/2023
此外,这不是有效的MySQL代码,您确定标记了正确的数据库系统吗
0赞 Jonathan Edward 11/17/2023
@nbk你能帮我吗?
0赞 jarlh 11/17/2023
您使用的是哪些 dbms?

答:

0赞 nbk 11/17/2023 #1

基本上是 Gap 和 Island probkem

WITH cte AS(SELECT 
   account_id
  ,dt
,type
  , IF(type <> LAG(type) OVER(ORDER BY account_id,dt) OR LAG(type) OVER(ORDER BY account_id, dt) IS NULL,1,0) sm
FROM activities)
,CTE2 as (
  SELECT 
   account_id
  ,dt
,type
,SUM(sm) OVER(ORDER BY account_id,dt)  grp
  FROM cte)
SELECT
mac,
  
  MIN(dt) as min_dt, MAX(dt) as MAX , count(*) cnt
FROM CTE2 c JOIN accounts a ON c.account_id = a.id
WHERE type = 'ERROR'
GROUP BY grp, mac
HAVING cnt > 3
苹果电脑 min_dt 麦克斯 碳纳米管
分子式:C4-85-20-F3-E9-CD 11 14 4

小提琴

或者可以被其他数据库使用,而不是作为之前的示例,仅适用于MySQL 8.xCASE WHEN

WITH cte AS(SELECT 
   account_id
  ,dt
,type
  , CASE WHEN type <> LAG(type) OVER(ORDER BY account_id,dt) OR LAG(type) OVER(ORDER BY account_id, dt) IS NULL
  THEN 1 ELSE 0 END sm
FROM activities)
,CTE2 as (
  SELECT 
   account_id
  ,dt
,type
,SUM(sm) OVER(ORDER BY account_id,dt)  grp
  FROM cte)
SELECT
mac,
  
  MIN(dt) as min_dt, MAX(dt) as MAX , count(*) cnt
FROM CTE2 c JOIN accounts a ON c.account_id = a.id
WHERE type = 'ERROR'
GROUP BY grp, mac
HAVING cnt > 3
苹果电脑 min_dt 麦克斯 碳纳米管
分子式:C4-85-20-F3-E9-CD 11 14 4

小提琴

评论

1赞 jarlh 11/17/2023
而不是会使其更具可移植性,并且几乎符合 ANSI SQL。(未标记 dbms。caseif