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

推荐订阅源

V
Visual Studio Blog
博客园 - 司徒正美
博客园_首页
Jina AI
Jina AI
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
月光博客
月光博客
I
InfoQ
M
MIT News - Artificial intelligence
T
Tailwind CSS Blog
L
LangChain Blog
Last Week in AI
Last Week in AI
A
About on SuperTechFans
B
Blog
博客园 - 叶小钗
雷峰网
雷峰网
H
Help Net Security
WordPress大学
WordPress大学
大猫的无限游戏
大猫的无限游戏
博客园 - 【当耐特】
云风的 BLOG
云风的 BLOG
Microsoft Azure Blog
Microsoft Azure Blog
小众软件
小众软件
aimingoo的专栏
aimingoo的专栏
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻

博客园 - 挖土.

学笛子 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