【问题标题】:Select top 10 percent, also bottom percent in SQL Server在 SQL Server 中选择前 10% 和最低百分比
【发布时间】:2016-04-13 10:23:36
【问题描述】:

我有两个问题:

  1. 当使用select top 10 percent 语句时,例如在一个分数为 100 的测试数据库上,像这样:

    Select top 10 percent score 
    from test
    

    SQL Server 会返回 10 个最高分数,还是仅返回前 10 个 obs(基于数据现在的样子)(例如,如果数据以最低分数首先出现的方式输入数据库,那么这将返回最低分数吗? 10 分)?

  2. 我希望能够在这 100 个分数中获得前 10 个最高分和后 10 个最低分,我该怎么办?

【问题讨论】:

  • 使用您的分数字段排序并根据您的需要应用 SELECT TOP 10 或 BOTTOM 10
  • 没有ORDER BY,数字 1 毫无意义。什么都不能保证,因为表格没有固有顺序。

标签: sql-server sql-server-2008 percentile


【解决方案1】:

使用UNION ALL 意味着它将对所有行计数两次。

您可以按如下方式进行一次计数。这是否会更有效将取决于(例如,取决于索引)。

WITH T
     AS (SELECT *,
                1E0 * ROW_NUMBER()
                        OVER (
                          ORDER BY score) / COUNT(*)
                                                  OVER() AS p
         FROM   test)
SELECT *
FROM   T
WHERE  p < 0.1
        OR p > 0.9 

【讨论】:

  • 我以前在代码中看到过“1E0”,我很好奇你正在寻找什么行为。它是隐式数字转换或转换的简写吗?我知道这意味着 1*10^0。
  • @cdc 它只是强制转换为浮点数以避免整数除法。
【解决方案2】:

您还可以使用NTILE 窗口函数将您的分数分成 10 组数据 - 组号。 1 将是最低的 10%,第 1 组。 10 将是前 10%:

;WITH Percentile AS
(
    SELECT
        Score,
        ScoreGroup = NTILE(10) OVER(ORDER BY Score)
    FROM
        test
)
SELECT * 
FROM Percentile
WHERE ScoreGroup IN (1, 10)

【讨论】:

    【解决方案3】:
    select score from 
        (Select top 10 percent score
         from test
         order by score desc
        )a
    union all   
    select score from 
       (select top 10 percent score
        from test
        order by score asc
       )b
    

    如果允许重复,请使用 union

    【讨论】:

      【解决方案4】:

      在前 90 个查询中使用升序。然后,在前 10 个查询中降序。然后,合并这两个查询

      【讨论】:

        猜你喜欢
        • 2016-05-09
        • 2023-04-08
        • 1970-01-01
        • 1970-01-01
        • 2022-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多