2016-01-08 29 views
2

我有兩個問題:選擇前10%,同時在SQL Server底部百分之

  1. 當使用select top 10 percent語句,例如以100分的測試數據庫上,像這樣:

    Select top 10 percent score 
    from test 
    

    根據數據現在的樣子,SQL Server會返回10個最高得分還是僅僅前10個obs(例如,如果數據以最低分出現在第一位的方式輸入到數據庫中,那麼這將返回最低10成績)?

  2. 我希望能夠從這100個分數中得到前10名最高分和最低10分,我該怎麼辦?

+1

使用順序通過您的分數字段並根據您的需要應用SELECT TOP 10或BOTTOM 10 – techspider

+0

沒有'ORDER BY',數字1是沒有意義的。沒有什麼是保證的,因爲表格有* no *固有順序。 –

回答

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 
+0

我在代碼中見過「1E0」,我很好奇你在用它尋找什麼樣的行爲。隱式數字轉換或轉換是否簡單?我知道這意味着1 * 10^0。 – CDC

+0

@cdc它只是強制浮動以避免整數除法。 –

2

您也可以使用NTILE窗函數,以便將比分變成10組數據 - 組沒有。 1將是最低的10%,小組號碼。 10將是前10%:

;WITH Percentile AS 
(
    SELECT 
     Score, 
     ScoreGroup = NTILE(10) OVER(ORDER BY Score) 
    FROM 
     test 
) 
SELECT * 
FROM Percentile 
WHERE ScoreGroup IN (1, 10) 
0
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 

如果允許重複使用工會

+0

關鍵字'union'附近的語法不正確。 –

+0

請參閱編輯答案。 – Sahi

0

使用遞增在查詢前90。然後,在查詢降前10 。然後,結合這兩個查詢