0

我目前正在尝试使用嵌套子查询来过滤嵌套循环每一层的行。我这样做的原因是因为查询是由用户在应用程序级别进行的,并且过滤器的顺序是由他们构建的。

下面是一个可以使用接口创建的查询示例:

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,唯一相关的列是valuecolumn1column2date

如果用户决定他们可以在层次结构中将 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);

返回上面的第二个错误。

4

2 回答 2

2

使用 时GROUP BY,子句中的每一列都SELECT必须通过聚合函数(如MAXMINAVG、...)定义,或者必须包含在GROUP BY子句中。

于 2013-04-30T15:49:43.197 回答
1

in语句中的查询没有意义:

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)

该表达式使用聚合函数 ( stdev()),但没有对应group by的 。所以这将只返回一行。top 2000是不必要的。

也许您期望stdev()从外部获得group by。但它不是那样工作的。where是在 之前处理的group by。如果你想要随后的结果,那么你会想要一个having子句。但该having子句无法与value自身相提并论。

我建议您再问一个问题来解释过滤和嵌套的作用。如所写,我看不到此查询的特定用途。一个值极不可能出现在标准偏差列表中。即使这些值非常非常接近,微小的数值差异也会阻止in工作。

于 2013-04-30T15:56:23.277 回答