首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Server按前10%分组并过滤前10%

Server按前10%分组并过滤前10%
EN

Stack Overflow用户
提问于 2016-03-01 19:08:55
回答 2查看 310关注 0票数 0

我正在尝试构建一个查询,首先按季度分组,然后获得销售额的前10%。示例:如果我按季度分组,2007年Q1的结果应该是4175行,这意味着在经过10% calc (脚本底部)之后,2007年Q1的结果应该是417行。之前的查询是正确分组的,即2007年Q1为4,174,但在前10%筛选器之后,得到了不正确的263行值。

我编辑了该查询,以得到下面的查询。现在我得到了以下错误: Subquery返回的值超过一个。当子查询跟随=、!=、<、<=、>、>=或子查询用作表达式时,这是不允许的。

写这个查询的正确方法是什么?

代码语言:javascript
复制
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])
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-01 19:24:30

如果使用Windows函数,则很简单

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2016-03-01 19:31:16

我只想用 window function

代码语言:javascript
复制
;WITH CTE as (
    SELECT *,
        NTILE(10) OVER (PARTITION BY quarter ORDER BY Price DESC) as NTILE
    FROM [dbo].[top10salesbyyear]
)
SELECT *
FROM CTE
WHERE NTILE = 1
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35731356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档