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