Sql 一列中具有相同值的多行

Sql 一列中具有相同值的多行,sql,plsql,oracle11g,Sql,Plsql,Oracle11g,您好,我有以下情况的问题。 我有一个表“应用程序日志”作为 我必须找到一个应用程序名称的“n”相应失败状态,并将其作为结果返回。例如,如果n=5,我的查询必须返回app_name=Application 3。以下查询在SQL Server中工作。我看不出它为什么不能在Oracle中工作: SELECT [App_name] FROM ( SELECT [App_name], [date], [status], ROW_NUMBER() OVER (PARTITION B

您好,我有以下情况的问题。 我有一个表“应用程序日志”作为


我必须找到一个应用程序名称的“n”相应失败状态,并将其作为结果返回。例如,如果n=5,我的查询必须返回app_name=Application 3。

以下查询在SQL Server中工作。我看不出它为什么不能在Oracle中工作:

SELECT [App_name]
FROM (
   SELECT [App_name], [date], [status],
          ROW_NUMBER() OVER (PARTITION BY App_name ORDER BY [date]) 
          -
          ROW_NUMBER() OVER (PARTITION BY App_name, 
                                          CASE 
                                             WHEN status = 'FAILED' THEN 1
                                             ELSE 2 
                                          END 
                             ORDER BY [date]) AS grp
   FROM ApplicationLog) AS t
WHERE status = 'FAILED'   
GROUP BY [App_name], grp
HAVING COUNT(*) >= 5

以下查询在SQL Server中工作。我看不出它为什么不能在Oracle中工作:

SELECT [App_name]
FROM (
   SELECT [App_name], [date], [status],
          ROW_NUMBER() OVER (PARTITION BY App_name ORDER BY [date]) 
          -
          ROW_NUMBER() OVER (PARTITION BY App_name, 
                                          CASE 
                                             WHEN status = 'FAILED' THEN 1
                                             ELSE 2 
                                          END 
                             ORDER BY [date]) AS grp
   FROM ApplicationLog) AS t
WHERE status = 'FAILED'   
GROUP BY [App_name], grp
HAVING COUNT(*) >= 5

这是另一种仅利用单个OLAP功能的方法:

SELECT App_name, Max(date) AS LastFail
FROM
 (
   SELECT App_name, date, status,
       -- check if the last 5 rows only contain FAILED
          Min(CASE WHEN status = 'FAILED' THEN 1 ELSE 0 end) 
          Over (PARTITION BY App_name
                ORDER BY date
       -- caution, as this includes the current row it must be n-1
                ROWS 4 Preceding) AS x
   FROM ApplicationLog
 ) AS t
WHERE x = 1
GROUP BY App_name

这是仅使用单个OLAP功能的另一种方法:

SELECT App_name, Max(date) AS LastFail
FROM
 (
   SELECT App_name, date, status,
       -- check if the last 5 rows only contain FAILED
          Min(CASE WHEN status = 'FAILED' THEN 1 ELSE 0 end) 
          Over (PARTITION BY App_name
                ORDER BY date
       -- caution, as this includes the current row it must be n-1
                ROWS 4 Preceding) AS x
   FROM ApplicationLog
 ) AS t
WHERE x = 1
GROUP BY App_name

您的问题不清楚应用程序3在{0,1,2,3,4}中的
n是否也失败?在{0,1,2,3,4}中的n是否也失败?您的问题不清楚应用程序3在{0,1,2,3,4}中的
n是否也失败?在{0,1,2,3,4}中的n是否也失败?