SQL为每行选择前10名
我在以下代码中为每行选择顶部时遇到一些问题: 这将基于LineNoID,即lineSQL为每行选择前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
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'