Sql 多列的第25百分位

Sql 多列的第25百分位,sql,sql-server,tsql,Sql,Sql Server,Tsql,假设我有一个表,其中有列a,B,C,D,E,等等,其中每列都是int。此表中填充了数百行,每列中都有随机值。返回每列25%对应值的最佳方法是什么 例如: A B C D E 1 5 8 9 3 3 6 5 0 2 8 3 6 1 8 4 1 8 3 1 7 2 2 6 9 这里列A由值1、3、4、8和7组成。此集合的第25个百分位应为3。列B由值1、2、3、5和6组成。此集合的第25个百分位应为2C为5,D为1,E为2。因为有5行,所以第25个百分位只是第二个最小值。如果有40行,它将是第10

假设我有一个表,其中有列
a
B
C
D
E
,等等,其中每列都是
int
。此表中填充了数百行,每列中都有随机值。返回每列25%对应值的最佳方法是什么

例如:

A B C D E
1 5 8 9 3
3 6 5 0 2
8 3 6 1 8
4 1 8 3 1
7 2 2 6 9
这里列
A
由值1、3、4、8和7组成。此集合的第25个百分位应为3。列
B
由值1、2、3、5和6组成。此集合的第25个百分位应为2<代码>C为5
D
1
E
2。因为有5行,所以第25个百分位只是第二个最小值。如果有40行,它将是第10个最小值。如何有效地编写返回以下内容的查询:

A B C D E
3 2 5 1 2

我所尝试的:

WITH 
    ATable as (
        SELECT A, CAST(NTILE(100) OVER (ORDER BY A) as int) as Percentile
        FROM MyTable
    ),
    BTable as (
        SELECT B, CAST(NTILE(100) OVER (ORDER BY B) as int) as Percentile
        FROM MyTable
    ),
    ...
SELECT
    (SELECT TOP 1 A FROM ATable where Percentile = 25) as A,
    (SELECT TOP 1 B FROM BTable where Percentile = 25) as B,
    ...

我有大约40个这样的专栏,我对我的数据集和NTILE的经验是,有这么多的专栏,性能成为一个严重的问题。有人有更好的想法吗?

您的解决方案是正确的。我看不到比这更好的解决方案

每列需要不同的行,因此必须分别查询每一列。如果你有40列,那么它是40个CTE连接在一起。简单


通常情况下,对于满足某些条件的行,您会期望整行或一组或多行或一部分列:不要期望单独查询每一列,以获取与同一行中其他值无关的值。

我不确定以下文章是否仍然与当前版本的MS SQL server相关,但你可以去看看


谢谢你的回答。很高兴知道我什么时候该停止寻找。在接受回答之前,我会把这个问题公诸于众几天,但如果没有更好的答案,你的问题也会解决。顺便说一句,我承认这个问题抽象起来很奇怪。具体来说,我试图用NBA(篮球)球员数据来做这件事。假设每一列都是一个单独的统计数据,比如分数、助攻、盖帽等等。我需要一下子确定25%的所有统计数据。这些25%的统计数据代表了我正在制作的一个虚拟篮球模拟中“普通子”的统计数据。谢谢。我会试试看是否有效。如果承诺的40倍改进取得成果,那就太棒了。如果取得成果,请随时通知我们