Sql 理解。在试图用最少的、人类可读的示例数据创建一个问题时,我遗漏了一些我没有意识到的相关数据。我用更好的示例数据创建了一个新问题:我将保留此问题的原样,并将接受一个与原始数据一致且具有Vertica理解的语法的答案。Vertica给我以下错误:error:s
Sql 理解。在试图用最少的、人类可读的示例数据创建一个问题时,我遗漏了一些我没有意识到的相关数据。我用更好的示例数据创建了一个新问题:我将保留此问题的原样,并将接受一个与原始数据一致且具有Vertica理解的语法的答案。Vertica给我以下错误:error:s,sql,sql-server,tsql,analytics,vertica,Sql,Sql Server,Tsql,Analytics,Vertica,理解。在试图用最少的、人类可读的示例数据创建一个问题时,我遗漏了一些我没有意识到的相关数据。我用更好的示例数据创建了一个新问题:我将保留此问题的原样,并将接受一个与原始数据一致且具有Vertica理解的语法的答案。Vertica给我以下错误:error:syntax error在“1”处或附近Vertica给我以下错误:error:syntax error在“1”处或附近Vertica给了我以下错误:错误:无法将多个命令插入到准备好的语句中@AkiKanerva是否使用我的数据进行插入?抱歉,我
理解。在试图用最少的、人类可读的示例数据创建一个问题时,我遗漏了一些我没有意识到的相关数据。我用更好的示例数据创建了一个新问题:我将保留此问题的原样,并将接受一个与原始数据一致且具有Vertica理解的语法的答案。Vertica给我以下错误:
error:syntax error在“1”处或附近
Vertica给我以下错误:error:syntax error在“1”处或附近
Vertica给了我以下错误:错误:无法将多个命令插入到准备好的语句中
@AkiKanerva是否使用我的数据进行插入?抱歉,我在转换为Vertica语法时出错。它现在执行,但不区分每个任务的结果。@AkiKanerva添加按任务名分组以实现此目的。我会更新答案是的,更新后的答案有效!作为参考,Vertica不理解表格的@
符号或[min]
周围的括号。忽略这些将通过语法检查。Vertica给我以下错误:错误:无法在准备好的语句中插入多个命令
@AkiKanerva是否使用我的数据进行插入?抱歉,我在转换为Vertica语法时出错。它现在执行,但不区分每个任务的结果。@AkiKanerva添加按任务名分组以实现此目的。我会更新答案是的,更新后的答案有效!作为参考,Vertica不理解表格的@
符号或[min]
周围的括号。把这些排除在语法检查之外。对于像我这样仍在学习的人来说,这是一个很好的解释。然而,Vertica给了我错误:语法错误在或接近“outer”
对于像我这样仍在学习的人来说是极好的解释。然而,Vertica给了我错误:在“outer”处或附近出现语法错误
row eventName taskName timestamp userName
1 fail ABC 10.5 John
2 fail ABC 18.0 John
3 fail ABC 19.0 Mike
4 fail XYZ 21.0 John
5 fail XYZ 23.0 Mike
6 success ABC 25.0 John
7 fail ABC 26.0 John
8 success ABC 28.0 John
WITH
Successes
AS
(
SELECT
events.userName
,events.taskName
,MIN(events.timestamp) AS FirstSuccessTime
FROM events
WHERE events.eventName = 'success'
GROUP BY events.userName, events.taskName
)
SELECT
events.userName
,events.taskName
,COUNT(events.eventName) AS FailuresUntilFirstSuccess
FROM
Successes
LEFT JOIN events
ON events.taskName = Successes.taskName
AND events.timestamp < Successes.FirstSuccessTime
AND events.eventName = 'fail'
GROUP BY events.userName, events.taskName
;
select username,
sum(case when success_cnt = 0 and eventName = 'failure' then 1 else 0 end) as numfailures_to_first_success
from (select e.*,
sum(case when e.eventName = 'Success' then 1 else 0 end) over (partition by e.username order by e.row) as success_cnt
from events e
) e
group by username;
Select A.*
,B.*
From (
Select Top 1 with ties *
from YourTable
Where [eventName]='success'
Order By Row_Number() over (Partition By taskName,userName Order by [row])
) A
Cross Apply (
Select Cnt=count(*)
From YourTable
Where taskName=A.taskName and A.userName=userName and [row]<A.[Row] and eventName='fail'
) B
DECLARE @events TABLE([row] INT,eventName VARCHAR(50),taskName VARCHAR(50),userName VARCHAR(50))
INSERT INTO @events
VALUES(1,'fail','ABC','John')
,(2,'fail','ABC','John')
,(3,'fail','ABC','Mike')
,(4,'fail','XYZ','John')
,(5,'fail','XYZ','Mike')
,(6,'success','ABC','John')
,(7,'fail','ABC','John')
,(8,'success','ABC','John')
,(9,'success','ABC','Mike')
SELECT * FROM @events;
WITH
cte
AS (
SELECT userName
,taskName
,MIN(row) AS [min]
FROM @events
WHERE eventName = 'success'
GROUP BY userName,taskName)
SELECT e.userName
,e.taskName
,COUNT(1) AS attempts
FROM @events e
JOIN cte c ON e.userName = c.userName
WHERE e.row < c.[min]
GROUP BY e.userName, e.taskName
with Failures as
(
select * from Event where event_name = 'fail'
),
Q as
(
select * from Event E
outer apply
(
select count(*) cnt from Failures F
where F.task_name = E.task_name and F.username = E.username and F.ts < E.ts
) F
where E.event_name = 'success'
)
select * from
(
select Q.*,
row_number() over (partition by event_name, task_name, username order by ts) o from Q
) K where K.o = 1
id event_name task_name timestamp username cnt
-- ---------- ---------- ---------- --------- ---
6 success ABC 25 John 2
insert Event select 'success', 'XYZ', 29.0, 'Mike':
id event_name task_name timestamp username cnt
-- ---------- ---------- ---------- --------- ---
6 success ABC 25 John 2
9 success XYZ 29 Mike 1
SELECT *, COUNT(*) OVER (PARTITION BY T1.userName, T1.taskName)
FROM tbl AS T1
WHERE T1.row < ( SELECT MIN(row)
FROM tbl AS T2
WHERE T2.userName = T1.userName
AND T2.taskName = T1.taskName
AND T2.eventName = 'success');
IF OBJECT_ID(N'tempdb..#taskevents', N'U') IS NOT NULL
DROP TABLE #taskevents;
GO
CREATE TABLE #taskevents (
eventName varchar(10)
, taskName varchar(10)
, ts decimal(3,1)
, userName varchar(10)
) ;
INSERT INTO #taskevents ( eventName, taskName, ts, userName )
VALUES
('fail','ABC','10.5','John')
, ('fail','ABC','10.6','John')
, ('fail','ABC','18.0','John')
, ('fail','ABC','22.0','John')
, ('fail','ABC','22.5','John')
, ('success','ABC','25.0','John')
, ('fail','ABC','26.0','John')
, ('success','ABC','28.0','John')
, ('fail','XYZ','10.7','John')
, ('fail','XYZ','21.0','John')
, ('fail','ABC','19.0','Mike')
, ('fail','XYZ','23.0','Mike')
, ('success','XYZ','28.5','Mike')
, ('success','QVC','42.0','Mike')
;
SELECT s3.userName, s3.taskName, AVG(s3.failCount) AS avgFailCount
FROM (
SELECT s1.userName, s1.taskName, s1.ts, s1.PreviousTS, COALESCE(s2.failCount,0) AS failCount
FROM (
SELECT t1.userName, t1.taskName, t1.ts, LAG(t1.ts) OVER (PARTITION BY t1.userName, t1.taskName ORDER BY t1.ts) AS PreviousTS --ROW_NUMBER() OVER (PARTITION BY t1.userName ORDER BY t1.ts) AS rn
FROM #taskevents t1
WHERE t1.eventName = 'success'
) s1
OUTER APPLY (
SELECT t2.userName, t2.taskName, COUNT(*) AS failCount
FROM #taskevents t2
WHERE t2.eventName = 'fail'
AND t2.userName = s1.userName
AND t2.taskName = s1.taskName
AND t2.ts < s1.ts
AND ( t2.ts >= s1.PreviousTS OR s1.PreviousTS IS NULL )
GROUP BY t2.userName, t2.taskName
) s2
) s3
GROUP BY s3.userName, s3.taskName