SQL为每行选择前10名

SQL为每行选择前10名,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,我在以下代码中为每行选择顶部时遇到一些问题: 这将基于LineNoID,即line SELECT TOP 10 DTM.[LineNoID] as [Line ID], DTM.[Fault Code] AS [DTM Fault Code], DTFC.[Fault Code] AS [DTFC Fault Code], COUNT(DTM.[Fault Code]) AS [Fau

我在以下代码中为每行选择顶部时遇到一些问题:

这将基于LineNoID,即line

SELECT TOP 10

        DTM.[LineNoID]          as [Line ID],
        DTM.[Fault Code]        AS [DTM Fault Code],
        DTFC.[Fault Code]       AS [DTFC Fault Code], 
        COUNT(DTM.[Fault Code]) AS [Fault Code Occurences], 
        DTFC.[Fault Name],
        SUM(DTM.[Minutes Down]) AS [Total Minutes Down]

FROM

        DTMain          AS DTM,
        DTFaultCodes    AS DTFC,
        DTLine          AS DTL

WHERE   

        DTM.[Fault Code] = DTFC.[Fault Code]

AND     

        DTM.LineNoID = DTL.[LineNoID]

AND

        DTFC.[Category] = 'E'

GROUP BY 
            DTM.[LineNoID],
            DTM.[Fault Code],
            DTFC.[Fault Code],
            DTFC.[Fault Name]           

ORDER BY [Total Minutes Down] DESC
我看过其他几篇文章,正在努力将它们转换成我的代码。任何帮助都将不胜感激

谢谢, 大卫

更新的查询:

SELECT
        [Line ID],
        [DTM Fault Code],
        [DTFC Fault Code],
        [Fault Code Occurences],
        [Total Minutes Down]
FROM
  (
SELECT
        ROW_NUMBER() OVER (PARTITION BY DTM.[LineNoID] ORDER BY SUM([Minutes Down] AS [Total Minutes Down]) DESC) [Line ID],
        DTM.[LineNoID]          AS [Line ID],
        DTM.[Fault Code]        AS [DTM Fault Code],
        DTFC.[Fault Code]       AS [DTFC Fault Code], 
        COUNT(DTM.[Fault Code]) AS [Fault Code Occurences], 
        DTFC.[Fault Name]
FROM
        DTMain          AS DTM,
        DTFaultCodes    AS DTFC,
        DTLine          AS DTL
WHERE
        DTM.[Fault Code] = DTFC.[Fault Code]
AND
        DTM.LineNoID = DTL.[LineNoID]
AND
        DTFC.[Category] = 'E'
GROUP BY
            DTM.[LineNoID],
            DTM.[Fault Code],
            DTFC.[Fault Code],
            DTFC.[Fault Name]
  ) s
WHERE [Total Minutes Down] <= 10

ORDER BY [Total Minutes Down] DESC
它显示“SUM”不是可识别的内置函数名。当运行上述程序时


为缺乏知识道歉

下面是一个基于我自己的数据库SQL 2012中的日志记录表的示例:

SELECT 
    IdentifyingValue,
    GroupingValue,
    RowNum,
    SummedValue
FROM 
  (
    SELECT  
        TrgTabName AS IdentifyingValue, 
        CAST(JobDate AS DATE) GroupingValue, 
        ROW_NUMBER() OVER (PARTITION BY TrgTabName ORDER BY SUM(TrgTabNewRows) DESC) RowNum,
        SUM(TrgTabNewRows) SummedValue
    FROM DWA_JobTableCount
    GROUP BY TrgTabName, CAST(JobDate AS DATE)
  ) s
WHERE RowNum <= 3

这是您正在寻找的顶级SQLServer功能吗??尽管你应该提到你的RDBMS,因为它取决于它这种旧式的逗号分隔的表列表样式在20多年前随着ANSI-92 SQL标准的出现而停止使用ago@Goon10很抱歉,我忘记将前10名添加回select语句,现在将编辑此项。在这里,它向我展示了所有行的前10个错误,因为我在查找每行的前10个错误。@telegna我将在这里查看一些数据,我正在努力以任何可视形式获取格式,所以SQL Fiddle可能会比您建议的更好。目前,它显示了前10名筛选的所有行的总分钟数,我想要的是每行的前10分钟数。我希望这有帮助。太好了!我目前没有访问2005实例的权限来提供语法,但是从内存中可以找到类似ROW_NUMBER OVER PARTITION BY LineNoID ORDER BY[Total Minutes Down]的内容,因为RowNum应该进入子查询,然后从该查询中选择RowNum所在的所有内容。您可以查看一下我更新的SQL并建议我的错误所在吗?好的,我已经检查了您的SQL并记录了需要修复的区域。我还提供了一个代码示例,显示了它可能的样子。查看这两个更新,确保您了解正在发生的事情,并让我知道此更新是否适合您。太棒了!这正是我想要的,非常感谢你们的帮助。非常感谢
SELECT -- returns the data you wanted originally
    [Line ID],
    [DTM Fault Code],
    [DTFC Fault Code],
    [Fault Code Occurrences],
    [Fault Name],
    [Total Minutes Down]
FROM
  (
    SELECT -- adds the row number 
        [Line ID],
        [DTM Fault Code],
        [DTFC Fault Code],
        [Fault Code Occurrences],
        [Fault Name],
        [Total Minutes Down],
        ROW_NUMBER() OVER (PARTITION BY [Line ID] ORDER BY [Total Minutes Down] DESC) RowNum -- numbers, in descending order, the rows for each Line ID
    FROM
      (
        SELECT -- retrieves the base (aggregated) data used by the query
            DTM.[LineNoID]          as [Line ID],
            DTM.[Fault Code]        AS [DTM Fault Code],
            DTFC.[Fault Code]       AS [DTFC Fault Code], 
            COUNT(DTM.[Fault Code]) AS [Fault Code Occurrences], 
            DTFC.[Fault Name],
            SUM(DTM.[Minutes Down]) AS [Total Minutes Down] -- you still need this column to use in your output and RowNum
        FROM
            DTMain DTM 
             INNER JOIN -- note the new syntax
            DTFaultCodes DTFC ON
                DTM.[Fault Code] = DTFC.[Fault Code] -- this specifies what the relationship between the two tables is: please confirm this is correct.
             INNER JOIN 
            DTLine DTL ON 
                DTM.LineNoID = DTL.LineNoID
        WHERE DTFC.Category = 'E' -- this doesn't really need to be in the JOIN condition: because you are using INNER JOIN, it does the same thing in the WHERE clause.
        GROUP BY 
            DTM.[LineNoID],
            DTM.[Fault Code],
            DTFC.[Fault Code],
            DTFC.[Fault Name]           
      ) s1 -- the subquery at the first (lowest) level: think of it as a table with the data returned by the SELECT statement
  ) s2 -- the subquery at the second (middle) level
WHERE RowNum <= 10 -- the filter that controls the 'TOP n'