我目前正在尝试使用嵌套子查询来过滤嵌套循环每一层的行。我这样做的原因是因为查询是由用户在应用程序级别进行的,并且过滤器的顺序是由他们构建的。
下面是一个可以使用接口创建的查询示例:
SELECT AVG(value) As Average, STDEV(value) As Standard_Deviation, DATEPART(mm,date) As Month
FROM sqlTable
WHERE value IN
(SELECT TOP 2000 STDEV(value) FROM sqlTable WHERE value IN
(SELECT TOP 10000 AVG(value) FROM sqlTable ORDER BY AVG(value))
ORDER BY STDEV(value) Desc)
GROUP BY name_column1, name_column2, DATEPART(mm, Date);
只有一个表sqlTable
,唯一相关的列是value
、column1
、column2
和date
。
如果用户决定他们可以在层次结构中将 STDEV 函数向上移动。因此,行首先由 STDEV 过滤(或者它被移动到最远的嵌套查询)。此查询当前未返回任何结果,当我添加value
到嵌套查询的选择时,我收到一条错误消息,指出它是无效列。
错误:
is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
Only one expression can be specified in the select list when the subquery is not introduced with EXISTS.
任何帮助是极大的赞赏。谢谢!
编辑: 过滤是在一个包含数百万条金融项目记录的单个表上,并允许用户查看哪些商品(column_name1 和 column_name2)是最有利可图和风险最小的(在其他功能中)。我使用嵌套查询的原因是因为基于 AVG 获得 TOP 10000,然后根据 STDEV 返回前 2000 个结果与基于 STDEV 获得 TOP 10000 并从中返回 TOP 2000 是不同的平均。我希望用户能够按照他们的意愿对计算进行排序,并且嵌套查询不止于此。
SELECT AVG(value) As Average, STDEV(value) As Standard_Deviation, DATEPART(mm,Date) As Month
FROM sqlTable
WHERE value IN
(SELECT TOP 2000 STDEV(value) FROM sqlTable WHERE value IN
(SELECT TOP 10000 column_name1, column_name2, value, AVG(value) FROM sqlTable
GROUP BY column_name1, column_name2, value ORDER BY AVG(value))
GROUP BY column_name1, column_name2, value
ORDER BY STDEV(value))
GROUP BY column_name1, column_name2, DATEPART(mm, Date);
返回上面的第二个错误。