SQL Server 2008 R2 的百分位数聚合

2023-12-24

我正在使用 SQL Server 2008 R2。我需要计算每个组的百分位数,例如:

SELECT id,
       PCTL(0.9, x) -- for the 90th percentile
FROM my_table
GROUP BY id
ORDER BY id

例如,给定这个 DDL (fiddle http://sqlfiddle.com/#!3/a3661/1) ---

CREATE TABLE my_table (id INT, x REAL);

INSERT INTO my_table
VALUES (7, 0.164595), (5, 0.671311), (7, 0.0118385), (6, 0.704592), (3, 0.633521), (3, 0.337268), (0, 0.54739), (6, 0.312282), (0, 0.220618), (7, 0.214973), (6, 0.410768), (7, 0.151572), (7, 0.0639506), (5, 0.339075), (1, 0.284094), (2, 0.126722), (2, 0.870079), (3, 0.369366), (1, 0.6687), (5, 0.199456), (5, 0.0296715), (1, 0.330339), (9, 0.0000459612), (5, 0.391947), (3, 0.753965), (8, 0.334207), (7, 0.583357), (3, 0.326951), (4, 0.207057), (2, 0.258463), (2, 0.0532811), (1, 0.751584), (7, 0.592624), (7, 0.673506), (5, 0.44764), (6, 0.733737), (5, 0.141215), (7, 0.222452), (3, 0.597019), (1, 0.293901), (4, 0.516213), (7, 0.498336), (6, 0.410461), (2, 0.32211), (1, 0.466735), (5, 0.720456), (8, 0.000428383), (3, 0.46085), (0, 0.402963), (7, 0.677002), (0, 0.400122), (1, 0.762357), (9, 0.158455), (7, 0.359723), (4, 0.225914), (7, 0.795345), (6, 0.902261), (2, 0.69533), (8, 0.593605), (6, 0.266233), (0, 0.917188), (9, 0.96353), (2, 0.577035), (8, 0.945236), (3, 0.257776), (4, 0.560569), (0, 0.838326), (2, 0.660338), (2, 0.537372), (8, 0.33806), (0, 0.545107), (1, 0.616673), (5, 0.30411), (0, 0.434737), (2, 0.588249), (9, 0.991362), (8, 0.772253), (6, 0.705396), (5, 0.323255), (8, 0.830319), (3, 0.679546), (4, 0.399748), (4, 0.440115), (6, 0.938154), (8, 0.333143), (9, 0.923541), (7, 0.19552), (4, 0.869822), (7, 0.620006), (4, 0.833529), (4, 0.297515), (4, 0.19906), (5, 0.540905), (9, 0.33313), (5, 0.200515), (5, 0.900481), (6, 0.02665), (3, 0.495421), (0, 0.96582), (9, 0.847218);

--- 我想要大约(在变化范围内)常用百分位数法 http://en.wikipedia.org/wiki/Percentile) 下列:

id  x
----------
0   0.9658
1   0.7624
2   0.6953
3   0.6795
4   0.8335
5   0.7205
6   0.9023
7   0.677
8   0.9452
9   0.9914

实际输入集大约有 200 万行,每个实际idgroup 有几十到几百(或可能更多)行。

我已经探索了 SO 和其他网站的解决方案,但似乎我检查的几十页左右的解决方案仅适用于计算整个行集而不是行集的每个组/分区的百分位数。 (我对 SQL 相对缺乏经验,所以我可能忽略了一些事情。)

我还查看了文档排名函数 http://msdn.microsoft.com/en-us/library/ms189798(v=sql.105).aspx,但我无法将有效的查询粘合在一起。

我想用PERCENTILE_DISC http://msdn.microsoft.com/en-us/library/hh231327(v=sql.110).aspx or PERCENTILE_CONT http://msdn.microsoft.com/en-us/library/hh231473(v=sql.110).aspx,但我现在还是坚持使用 2008 R2。


我喜欢直接进行这些计算,使用row_number()/rank()和窗口函数。内置函数很有用,但实际上并没有节省那么多精力:

SELECT id,
       MIN(CASE WHEN seqnum >= 0.9 * cnt THEN x END) as percentile_90
FROM (select t.*,
             row_number() over (partition by id order by x) as seqnum,
             count(*) over (partition by id) as cnt
      from my_table t
     ) t
GROUP BY id
ORDER BY id;

这采用第 90 个百分位或更高的第一个值。对此有一些变体可以进行连续版本(取小于或等于的最大值和大于的最小值并进行插值)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SQL Server 2008 R2 的百分位数聚合 的相关文章

  • AttributeError:尝试在 python 中运行 sqlalchemy 来管理我的 SQL 数据库时,“Engine”对象没有属性“execute”

    我有以下代码行不断给我一个错误 即引擎对象没有对象执行 我认为我一切都对 但不知道接下来会发生什么 似乎其他人也遇到了这个问题 重新启动他们的笔记本电脑就可以了 我正在使用 Pycharm 并已重新启动但没有任何解决方案 任何帮助是极大的赞
  • 使用全文搜索查找精确匹配

    使用 Sql Server 2008 如何使用全文搜索来实际找到精确的字符串匹配 我对此感到非常困难 而且我在网上找不到令人满意的解决方案 例如 如果我正在搜索字符串 Bojan Skrchevski 我希望第一个结果正是如此 到目前为止
  • 多个连接到同一个表

    我有这组表格和数据 CREATE TABLE item id INT PRIMARY KEY name VARCHAR CREATE TABLE property id INT PRIMARY KEY name VARCHAR CREATE
  • 对带有空白 NVARCHAR 或 NULL 检查的 VARCHAR 索引进行 Count(*) 会导致返回的行数加倍

    我有一张桌子 上面有VARCHAR列及其上的索引 每当一个SELECT COUNT 是在这张表上完成的 该表检查了COLUMN N OR COLUMN IS NULL它返回双倍的行数 SELECT 与相同的where子句将返回正确的记录数
  • 表达与空列表相同的 IN 条件的可移植方式是什么?

    例如 工作于sqllite3 select from orders where custid and status in 但它失败了postgres ksysdb select code applicable objecttype from
  • INNER JOIN 后从多个表获取最大日期

    我有以下两个表 table 1 ID HOTEL ID NAME 1 100 xyz 2 101 pqr 3 102 abc table 2 ID BOOKING ID DEPARTURE DATE AMOUNT 1 1 2013 04 1
  • 交换 ms-sql 表

    我想以尽可能最好的方式交换到桌子 我有一个 IpToCountry 表 并根据导入的外部 CSV 文件每周创建一个新表 我发现进行切换的最快方法是执行以下操作 sp rename IpToCountry IpToCountryOld go
  • SELECT DISTINCT HAVING 计算唯一条件

    我已经搜索过这个问题的答案 但找不到如何根据条件获取这个不同的记录集 我有一个包含以下示例数据的表 Type Color Location Supplier Apple Green New York ABC Apple Green New
  • SQLite 自然连接损坏?

    我刚刚开始了解 NATURAL JOIN 而 SQLite 的行为并不像我预期的那样 SELECT FROM r1 NATURAL JOIN r2 NATURAL JOIN r3 and SELECT FROM r1 NATURAL JOI
  • 在 MySQL 中插入时检查并防止相似字符串

    简要信息 我有3张桌子 Set id name SetItem set id item id position TempSet id 我有一个函数可以生成新的随机组合Item桌子 基本上 总是在成功生成之后 我在中创建一个新行Set表 获取
  • 什么会导致 Oracle ROWID 更改?

    AFAIK Oracle 中的 ROWID 表示相应数据文件中记录的物理位置 在什么情况下记录的ROWID可能会改变 我所知道的一个是分区表上的更新 它将记录 移动 到另一个分区 还有其他情况吗 我们的大多数数据库都是 Oracle 10
  • 无重复组合的交叉连接

    我知道这个问题与这个问题非常相似 对称交叉连接 https stackoverflow com questions 12490244 symmetric cross join还有这个 sql 中交叉连接的组合 不是排列 https stac
  • 如何从 SQL Server 中的 SELECT 进行更新?

    In SQL服务器 可以将行插入到带有INSERT SELECT陈述 INSERT INTO Table col1 col2 col3 SELECT col1 col2 col3 FROM other table WHERE sql coo
  • postgresql 中的锁定表

    我有一个名为 games 其中包含一个名为 title 该列是唯一的 数据库中使用PostgreSQL 我有一个用户输入表单 允许他插入新的 game in games 桌子 插入新游戏的功能会检查之前输入的游戏是否存在 game 与相同的
  • 如何在 DataColumn.Expression 中使用 IF/ELSE 或 CASE?

    我有一个包含 1 列的表 状态 我想添加另一列名为 Action 的列 其值如下 如果 Status Yes 则 Action Go 否则 Action Stop 我使用以下代码添加到 操作 列中 但它不起作用 myDataTable Co
  • 创建具有动态列数的临时表

    我正在尝试创建一个具有动态列数的临时表 set cmd SELECT into temp3 from select from sometable x pivot max buildrate for name in columns as y
  • 在 SQL Server 中通过标准差消除异常值

    我试图通过标准差消除 SQL Server 2008 中的异常值 我只想要特定列中包含该列平均值的 1 标准差范围内的值的记录 我怎样才能做到这一点 如果您假设事件呈钟形曲线分布 则只有 68 的值与平均值相差 1 个标准差以内 95 的值
  • 如何使用sql脚本更改列的属性

    如何使用 sql 脚本更改列的属性 这是我尝试过但出现错误的方法 ALTER TABLE dbo tblBiometricPattern COLUMN BiometricPatternID TINYINT NOT NULL IDENTITY
  • 有没有办法在 MySQL 中有效地对 TRUNCATE 或 DROP TABLE 进行 GRANT ?

    我最近在 MySQL 5 5 x 中尝试过 GRANT SELECT INSERT UPDATE DELETE TRUNCATE ON crawler TO my user localhost WITH GRANT OPTION 这会导致错
  • 每行中非空列的计数

    我有一个包含 4 列的表 在第 5 列中我想存储前 4 列中有多少个非空列的计数 例如 其中 X 是任意值 Column1 Column2 Column3 Column4 Count X X NULL X 3 NULL NULL X X 2

随机推荐

  • jspdf AutoTable :表格特定行的目标样式

    我正在为我的表格 pdf 使用 jsPDF AutoTable 插件 我的资料来源 javaScriptIncludeTag jspdf min js javaScriptIncludeTag jspdf plugin autotable
  • 类 CharField() 的参数

    有什么区别CharField name max length 100 and CharField max length 100 参数是什么 name 用于 什么是CharField 构造函数 有人可以给我一个链接吗 CharField 继承
  • 保持geom_rect半透明区域,但彩色轮廓

    我正在尝试使用 R 中的plotly 创建一个带有矩形的交互式绘图 我的主要想法正在发挥作用 然而 我所坚持的是允许每个矩形都有一个彩色轮廓 如数据的 填充 列中所描绘的 但是是一个完全透明的区域 以下是正在运行的 MWE library
  • 收款人不接受以该货币付款

    我正在尝试执行链式付款 其中主要收款人采用英镑 GBP 货币 我是交易的第二接收者 我的帐户设置为美元 但不阻止任何货币 如您所见 以下是确切的错误消息 接收方 不接受此货币的付款 请帮助我理解为什么会失败 我的帐户需要进行其他设置吗 我必
  • 如何找到 CUDA 的 epsilon、min 和 max 常量?

    我正在寻找 CUDA 设备的 epsilon 两个数字之间的最小步长 min 最小量值 和 max 最大量值 的值 即 FLT EPSILON DBL EPSILON FLT MIN DBL MIN 和 FLT MAX DBL MAX 中定
  • GOlang Scanf 错误

    当使用 Scanf 两次时 第一次它会获取用户输入 但第二次它不会并从函数中返回 这只是在 Windows 上运行时才会出现的问题 当我在 Mac 上运行它时 它会按预期工作 首先询问用户的用户名 然后询问他们的密码 下面是问题中的代码 我
  • Swift 可选的 inout 参数和 nil

    是否有可能有一个Optional inoutSwift 中函数的参数 我正在尝试这样做 func testFunc inout optionalParam MyClass if optionalParam 但是当我尝试调用它并通过时nil
  • swi prolog 中的优化

    假设我想找到 argmax x y z 1 2 20x 2 32xy 16y 2 2x 2y 受 x gt 0 y gt 0 z gt 0 且 x y z 0 我知道偏导数设置为 0 是 20x 16y 2 0 和 16x 16y 2 0
  • onCreate 方法内的屏幕截图在 android 中不起作用

    我正在一个 Android 应用程序中工作 我想在重写的方法 onCreate 中捕获当前活动的屏幕 当我在重写的方法 onCreate 中编写用于捕获屏幕的代码时 位图返回 null 但是 当我在同一活动中单击按钮中调用相同的代码时 位图
  • 在Container中挂载目录并与Host共享

    我以为我理解了文档 但也许我没有 我的印象是 v HOST PATH CONTAINER PATH标志是双向的 如果容器中有文件或目录 它们将被镜像到主机上 这使我们即使在删除 docker 容器后也能保留目录和文件 在官方 MySQL d
  • statsmodels wls_prediction_std 的数学背景

    wls prediction std 返回拟合模型数据的标准差和置信区间 我需要知道如何从协方差矩阵计算置信区间 我已经尝试通过查看源代码来解决这个问题 但没能做到 我希望你们中的一些人可以通过写出 wls prediction std 背
  • Android 在 addTextChangedListener (edittext) 中的某些条件下禁用肯定按钮

    这是我的对话框代码 如果编辑文本中的文本大小大于 5 我想禁用肯定按钮 如果大小 private void myDialog String title AlertDialog Builder builder new AlertDialog
  • 归档日志文件时内存不足错误

    我在运行控制台作业时遇到问题 该作业运行并创建我在午夜存档的每日日志文件 这将创建一个第二天的空白日志文件和一个存档文件 其中名称中包含昨天的日期以及旧文件的内容 用于调试我可能遇到但直到第二天才知道的问题 然而 自从我启动 BOT 的工作
  • 更改默认的 Ruby 参数

    我想更改传递给 Ruby 函数的默认参数 例如 而不是每次都写 1 2 3 do stuff option gt my option 我想修改默认值以便我可以编写 1 2 3 do stuff 更改默认参数的最简单 最干净 最像 Ruby
  • 通过 ssh 密钥访问 GitHub 组织

    也许我是瞎子 但我找不到一种方法来访问通过 SSH 密钥授予我访问权限的组织 我知道直接连接到您自己的帐户很容易 但是我该如何通过组织来做到这一点呢 您帐户的个人 SSH 密钥可识别您的 GitHub 用户 如果组织授予您访问权限 则这是通
  • 行进立方体问题

    我目前正在编写一个程序来使用 C 和 Opengl 实现 Marching Cube 然而 我最好的参考仅来自http local wasp uwa edu au pbourke geometry polygonise http local
  • 在 Rcpp 中的另一个 cpp 文件中定义的函数中使用一个 cpp 文件中定义的函数

    我有一个名为的 C 函数add文件中定义add cpp 内容add cpp below include
  • Mysql暂时抑制唯一索引

    我有一个在两列上有唯一索引的表 准确地说是 id parent 和 sort order id id parent sort order some data other data more data 1 1 1 lorem ipsum lo
  • 如何在 VS Code for Markdown 中禁用 IntelliSense?

    我不想在 Visual Studio Code 中为 Markdown 文件提供单词补全功能 如何禁用它 理想情况下 仅适用于 Markdown 但在最坏的情况下 即使是全局切换也是好的 可以配置 VS Code 中的 IntelliSen
  • SQL Server 2008 R2 的百分位数聚合

    我正在使用 SQL Server 2008 R2 我需要计算每个组的百分位数 例如 SELECT id PCTL 0 9 x for the 90th percentile FROM my table GROUP BY id ORDER B