惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

GbyAI
GbyAI
Microsoft Azure Blog
Microsoft Azure Blog
Jina AI
Jina AI
Hugging Face - Blog
Hugging Face - Blog
A
About on SuperTechFans
Y
Y Combinator Blog
D
DataBreaches.Net
I
InfoQ
Recent Announcements
Recent Announcements
Last Week in AI
Last Week in AI
G
Google Developers Blog
博客园_首页
博客园 - 司徒正美
V
V2EX
Stack Overflow Blog
Stack Overflow Blog
博客园 - 叶小钗
Engineering at Meta
Engineering at Meta
Apple Machine Learning Research
Apple Machine Learning Research
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
B
Blog
MongoDB | Blog
MongoDB | Blog
博客园 - 【当耐特】
D
Docker
量子位

博客园 - 挖土.

学笛子 PowerShell: Try...Catch...Finally 实现方法 How to set the compuder to auto login 让 PowerShell 2.0 支持 DotNet FrameWork 4.0 用 Powershell 安装Dotnet FrameWorrk 4.0 PowerShell 调用.netFramework中的静态函数 PowerGUI Visual Studio is now in beta! PowerShell 中定义和使用泛型 PowerShell 如何引用DLL PowerShell中Add-Content 和 Out-File 的区别 给string加几个扩展方法 加快 c++ Builder 5编译速度 Windows 7 下的 SUBST 命令 How to configure the BDE for Windows Vista/7 - 挖土. Linker problems with Borland builder Windows 7的“上帝模式” XML 序列化和反序列化详例代码 给存储过程传递一个表 VSIdeTesthost installation issue - 挖土.
SQL 中的中位值计算
挖土. · 2010-01-18 · via 博客园 - 挖土.

Posted on 2010-01-18 17:07  挖土.  阅读(1051)  评论()    收藏  举报

1. 在Northwind数据库上建立一个视图 VOrders

代码

SET NOCOUNT ON;
USE Northwind;
GOIF OBJECT_ID('dbo.VOrders'IS NOT NULL
  
DROP VIEW dbo.VOrders;
GO
CREATE VIEW dbo.VOrders
ASSELECT O.OrderID, O.OrderDate, O.CustomerID, O.EmployeeID, O.ShipVia,
  
SUM(OD.Quantity) AS Qty,
  
CAST(SUM(OD.Quantity * UnitPrice * (1 - Discount)) AS DECIMAL(122)) AS Value 
FROM dbo.Orders AS O
  
JOIN [Order Details] AS OD
    
ON O.OrderID = OD.OrderID
GROUP BY O.OrderID, O.OrderDate, O.CustomerID, O.EmployeeID, O.ShipVia
GO

 
2. 计算整个表中数据的中位值 (MSSQL 2000的做法)

代码

SELECT
(
 (
SELECT MAX(Value) FROM
   (
SELECT TOP 50 PERCENT Value FROM dbo.VOrders ORDER BY Value) AS H1)
 
+
 (
SELECT MIN(Value) FROM
   (
SELECT TOP 50 PERCENT Value FROM dbo.VOrders ORDER BY Value DESCAS H2)
/ 2 AS Median;


3. 用子查询来查询每个员工的中位值(MSSQL 2000的做法)

代码

SELECT EmployeeID,
(
 (
SELECT MAX(Value) FROM
   (
SELECT TOP 50 PERCENT Value FROM dbo.VOrders AS O1
    
WHERE O1.EmployeeID = E.EmployeeID
    
ORDER BY Value) AS H1)
 
+
 (
SELECT MIN(Value) FROM
   (
SELECT TOP 50 PERCENT Value FROM dbo.VOrders AS O2
    
WHERE O2.EmployeeID = E.EmployeeID
    
ORDER BY Value DESCAS H2)
/ 2 AS Median
FROM dbo.Employees AS E;


4.1 SQL 2005的做法,首先我们看看用来计算中位值的行的数据,这里用到了通用表(CTE)和Row_Number函数

代码

WITH OrdersRN AS
(
  
SELECT EmployeeID, Value,
    ROW_NUMBER() 
OVER(PARTITION BY EmployeeID ORDER BY Value) AS RowNum,
    
COUNT(*OVER(PARTITION BY EmployeeID) AS Cnt
  
FROM dbo.VOrders
)
SELECT EmployeeID, Value, RowNum, Cnt
FROM OrdersRN
WHERE RowNum IN((Cnt + 1/ 2, (Cnt + 2/ 2);


4.2 SQL 2005中,用通用表和Row_Number函数来计算中位值

代码

WITH OrdersRN AS
(
  
SELECT EmployeeID, Value,
    ROW_NUMBER() 
OVER(PARTITION BY EmployeeID ORDER BY Value) AS RowNum,
    
COUNT(*OVER(PARTITION BY EmployeeID) AS Cnt
  
FROM dbo.VOrders
)
SELECT EmployeeID, AVG(Value) AS Median
FROM OrdersRN
WHERE RowNum IN((Cnt + 1/ 2, (Cnt + 2/ 2)
GROUP BY EmployeeID;

关键词:中位值,中位值计算,Median,CTE,Row_Number