我正在尝试构建一个查询,首先按季度分组,然后获得销售额的前10%。示例:如果我按季度分组,2007年Q1的结果应该是4175行,这意味着在经过10% calc (脚本底部)之后,2007年Q1的结果应该是417行。之前的查询是正确分组的,即2007年Q1为4,174,但在前10%筛选器之后,得到了不正确的263行值。
我编辑了该查询,以得到下面的查询。现在我得到了以下错误: Subquery返回的值超过一个。当子查询跟随=、!=、<、<=、>、>=或子查询用作表达式时,这是不允许的。
写这个查询的正确方法是什么?
SELECT
[quarter]
,[address]
,[aptmnt]
,[listed]
,[cs_date]
,[updted]
,[price]
,[totsqft]
,[rooms]
,[bdrms]
,[baths]
,[sect]
FROM [dbo].[top10salesbyyear] p1
WHERE
(SELECT COUNT(*) FROM [dbo].[top10salesbyyear] p2 GROUP BY
[quarter]
,[address]
,[aptmnt]
,[listed]
,[cs_date]
,[updted]
,[price]
,[totsqft]
,[rooms]
,[bdrms]
,[baths]
,[sect]
HAVING p2.price >= p1.price)<=
(SELECT 0.1 * COUNT(*) FROM [dbo].[top10salesbyyear])发布于 2016-03-01 19:24:30
如果使用Windows函数,则很简单
WITH CTE as (
SELECT *,
count(*) OVER (partition by quarter) as total_rows,
row_number() OVER (partition by quarter order by price DESC) as rn
FROM [dbo].[top10salesbyyear]
)
SELECT *
FROM CTE
WHERE rn < total_row * 0.1发布于 2016-03-01 19:31:16
我只想用 window function
;WITH CTE as (
SELECT *,
NTILE(10) OVER (PARTITION BY quarter ORDER BY Price DESC) as NTILE
FROM [dbo].[top10salesbyyear]
)
SELECT *
FROM CTE
WHERE NTILE = 1https://stackoverflow.com/questions/35731356
复制相似问题