[英]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'。
我觉得查询需要按coachNodeId
和questionnaireNumber
值进行分组,以便它会输出这样的内容(我省略了questionnaireId
youngPersonNodeId
、 youngPersonName
、 youngPersonName
和score
列,因为它们对输出并不重要——它们只是用于推导出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.