繁体   English   中英

从子查询和 SQL SELECT 中的 ROW_NUMBER 窗口函数生成“平均”列

[英]Generate 'average' column from sub query and ROW_NUMBER window function in SQL SELECT

我有以下 SQL Server 表(带有示例数据):

问卷

id | coachNodeId | youngPersonNodeId | complete
1  | 12          | 678               | 1
2  | 12          | 52                | 1
3  | 30          | 99                | 1
4  | 12          | 678               | 1
5  | 12          | 678               | 1
6  | 30          | 99                | 1
7  | 12          | 52                | 1
8  | 30          | 102               | 1

回答

id | questionnaireId | score
1  | 1               | 1
2  | 2               | 3
3  | 2               | 2
4  | 2               | 5
5  | 3               | 5
6  | 4               | 5
7  | 4               | 3
8  | 5               | 4
9  | 6               | 1
10 | 6               | 3
11 | 7               | 5
12 | 8               | 5

内容节点

id  | text
12  | Zak
30  | Phil
52  | Jane
99  | Ali
102 | Ed
678 | Chris 

我有以下 T-SQL 查询:

SELECT
    Questionnaire.id AS questionnaireId, 
    coachNodeId AS coachNodeId, 
    coachNode.[text] AS coachName, 
    youngPersonNodeId AS youngPersonNodeId, 
    youngPersonNode.[text] AS youngPersonName,
    ROW_NUMBER() OVER (PARTITION BY Questionnaire.coachNodeId, Questionnaire.youngPersonNodeId ORDER BY Questionnaire.id) AS questionnaireNumber,
    score = (SELECT AVG(score) FROM Answer WHERE Answer.questionnaireId = Questionnaire.id)
FROM            
    Questionnaire
LEFT JOIN 
    ContentNode AS coachNode ON Questionnaire.coachNodeId = coachNode.id 
LEFT JOIN 
    ContentNode AS youngPersonNode ON Questionnaire.youngPersonNodeId = youngPersonNode.id
WHERE        
    (complete = 1)
ORDER BY 
    coachNodeId, youngPersonNodeId

此查询输出以下示例数据:

questionnaireId | coachNodeId | coachName | youngPersonNodeId | youngPersonName | questionnaireNumber | score
1               | 12          | Zak       | 678               | Chris           | 1                   | 1
2               | 12          | Zak       | 52                | Jane            | 1                   | 3
3               | 30          | Phil      | 99                | Ali             | 1                   | 5
4               | 12          | Zak       | 678               | Chris           | 2                   | 4
5               | 12          | Zak       | 678               | Chris           | 3                   | 4
6               | 30          | Phil      | 99                | Ali             | 2                   | 2
7               | 12          | Zak       | 52                | Jane            | 2                   | 5
8               | 30          | Phil      | 102               | Ed              | 1                   | 5

为了解释这里发生的事情…… 有各种各样的教练,他们的工作是对各种年轻人进行问卷调查,并记录分数。 教练可能会在以后对同一个年轻人重复几次问卷,希望他们得到更好的分数。 我试图实现的最终目标是教练的经理们想看看教练的表现如何,所以他们想看看问卷的分数是否有上升的趋势。 窗口函数代表了一种方法来确定同一教练/年轻人组合进行了多少次问卷调查。

我需要能够根据问卷编号确定平均分数。 例如,教练 'Zak' 在他的第一个问卷(其中问卷编号 = 1)中记录的分数为 '1' 和 '3',因此平均值为 2。对于他的第二份问卷(其中问卷编号 = 2),分数为 ' 3' 和 '5' 所以平均值是 4。所以在分析这些数据时,我们知道 Zak 的问卷分数随着时间的推移从第一次的平均 '2' 提高到第二次的平均 '4'。

我觉得查询需要按coachNodeIdquestionnaireNumber值进行分组,以便它会输出这样的内容(我省略了questionnaireId youngPersonNodeIdyoungPersonNameyoungPersonNamescore列,因为它们对输出并不重要——它们只是用于推导出averageScore - 并且对结果分组的方式没有用):

coachNodeId | coachName | questionnaireNumber | averageScore
12          | Zak       | 1                   | 2                      (calculation: (1 + 3) / 2)
12          | Zak       | 2                   | 4                      (calculation: (3 + 5) / 2)
12          | Zak       | 3                   | 4                      (only one value: 4)
30          | Phil      | 1                   | 5                      (calculation: (5 + 5) / 2)
30          | Phil      | 2                   | 2                      (only one value: 2)

谁能建议我如何修改我的查询以根据子查询和ROW_NUMBER窗口函数的分数输出平均分数? 我已经达到了 SQL 技能的极限!

非常感谢。

没有样本数据有点难以判断,但我认为您正在描述聚合:

SELECT q.coachNodeId AS coachNodeId, 
       cn.[text] AS coachName, 
       q.youngPersonNodeId AS youngPersonNodeId, 
       ypn.[text] AS youngPersonName,
       AVG(score)
FROM Questionnaire q JOIN
     ContentNode cn
     ON q.coachNodeId = cn.id  JOIN
     ContentNode ypn
     ON q.youngPersonNodeId = ypn.id LEFT JOIN
     Answer a
     ON a.questionnaireId = q.id
WHERE complete = 1
GROUP BY q.coachNodeID, cn.[text] AS coachName, 
         q.youngPersonNodeId, ypn.[text]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM