`

T-SQL查询学习笔记——求中值的几种方法

阅读更多
中值有两种定义:
1、当组中包含奇数个元素时,我们将直接返回中间的值
2、当组中包含偶数个元素时,返回两个中间值的平均值

示例:

--构造Groups表
IF OBJECT_ID('dbo.Groups') IS NOT NULL
  DROP TABLE dbo.Groups;
GO

CREATE TABLE dbo.Groups
(
  groupid  VARCHAR(10) NOT NULL,
  memberid INT         NOT NULL,
  string   VARCHAR(10) NOT NULL,
  val      INT         NOT NULL,
  PRIMARY KEY (groupid, memberid)
);

INSERT INTO dbo.Groups(groupid, memberid, string, val)
  VALUES('a', 3, 'stra1', 6);
INSERT INTO dbo.Groups(groupid, memberid, string, val)
  VALUES('a', 9, 'stra2', 7);
INSERT INTO dbo.Groups(groupid, memberid, string, val)
  VALUES('b', 2, 'strb1', 3);
INSERT INTO dbo.Groups(groupid, memberid, string, val)
  VALUES('b', 4, 'strb2', 7);
INSERT INTO dbo.Groups(groupid, memberid, string, val)
  VALUES('b', 5, 'strb3', 3);
INSERT INTO dbo.Groups(groupid, memberid, string, val)
  VALUES('b', 9, 'strb4', 11);
INSERT INTO dbo.Groups(groupid, memberid, string, val)
  VALUES('c', 3, 'strc1',;
INSERT INTO dbo.Groups(groupid, memberid, string, val)
  VALUES('c', 7, 'strc2', 10);
INSERT INTO dbo.Groups(groupid, memberid, string, val)
  VALUES('c', 9, 'strc3', 12);
GO

--使用NTILE求中值
WITH Tiles AS
(
  SELECT groupid, val,
    NTILE(2) OVER(PARTITION BY groupid ORDER BY val) AS tile
  FROM dbo.Groups
),
GroupedTiles AS
(
  SELECT groupid, tile, COUNT(*) AS cnt,
    CASE WHEN tile = 1 THEN MAX(val) ELSE MIN(val) END AS val
  FROM Tiles
  GROUP BY groupid, tile
)
SELECT groupid,
  CASE WHEN MIN(cnt) = MAX(cnt) THEN AVG(1.*val)
       ELSE MIN(val) END AS median
FROM GroupedTiles
GROUP BY groupid;

--利用ROW_NUMBER求中值,参与中值计算的两个值得绝对差小于或等于1

WITH RN AS
(
  SELECT groupid, val,
    ROW_NUMBER()
      OVER(PARTITION BY groupid ORDER BY val, memberid) AS rna,
    ROW_NUMBER()
      OVER(PARTITION BY groupid ORDER BY val DESC, memberid DESC) AS rnd
  FROM dbo.Groups
)
SELECT groupid, AVG(1.*val) AS median
FROM RN
WHERE ABS(rna - rnd) <= 1
GROUP BY groupid;

--通过从第一个行号衍生出第二个行号,降序行号可以用组中的行数减去升序行号再加1得到
WITH RN AS
(
  SELECT groupid, val,
    ROW_NUMBER() OVER(PARTITION BY groupid ORDER BY val) AS rn,
    COUNT(*) OVER(PARTITION BY groupid) AS cnt
  FROM dbo.Groups
)
SELECT groupid, AVG(1.*val) AS median
FROM RN
WHERE ABS(2*rn - cnt - 1) <= 1
GROUP BY groupid;

--IN((cnt+1)/2, (cnt+2)/2)方法
WITH RN AS
(
  SELECT groupid, val,
    ROW_NUMBER() OVER(PARTITION BY groupid ORDER BY val) AS rn,
    COUNT(*) OVER(PARTITION BY groupid) AS cnt
  FROM dbo.Groups
)
SELECT groupid, AVG(1.*val) AS median
FROM RN
WHERE rn IN((cnt+1)/2, (cnt+2)/2)
GROUP BY groupid;
GO

--使用top的方法求中值SELECT DISTINCT groupid,
  ((SELECT MAX(val)
    FROM (SELECT TOP 50 PERCENT val
          FROM dbo.Groups AS H1
          WHERE H1.groupid = G.groupid
          ORDER BY val) AS M1)
   +
   (SELECT MIN(val)
    FROM (SELECT TOP 50 PERCENT val
          FROM dbo.Groups AS H2
          WHERE H2.groupid = G.groupid
          ORDER BY val DESC) AS M2))
  /2. AS median
FROM dbo.Groups AS G;


分享到:
评论

相关推荐

    figure16-giants-feh坐标转换成功-处理中值问题-成功.py

    figure16-giants-feh坐标转换成功-处理中值问题-成功.py

    论文研究-基于局部二值模式的中值滤波检测算法.pdf

    针对数字图像处理及窜改中一种常用的处理模式——中值滤波,提出一种基于局部二值模式(LBP)的中值滤波窜改检测方法。首先对待测图像利用基于中心对称像素的局部二值模式算子(C-LBP)定位其特征提取区域,随后基于...

    Transact-SQL权威指南

    《Transact-SQL权威指南》是一本深入探讨SQL在数据库管理中的应用的书籍,主要针对Transact-SQL,这是Microsoft SQL ...书中的内容丰富多样,涵盖了从基础概念到高级应用的广泛知识,是学习和提升T-SQL技能的宝贵资源。

    空间滤波-线性滤波-平滑滤波-中值滤波-源码

    空间滤波主要包括线性滤波和平滑滤波,其中平滑滤波又包含了中值滤波,这是一种非常有效的去噪方法。本文将深入探讨这些概念,并提供相关的源码。 线性滤波是基于像素邻域的加权平均过程,它可以用来降低图像的高频...

    matlab-基于matlab的图像线性空间中值滤波仿真-源码

    在图像处理领域,中值滤波是一种非常有效的去噪方法,尤其对于消除椒盐噪声有显著效果。本项目是基于MATLAB实现的图像线性空间中的中值滤波仿真实验,通过源码分析,我们可以深入理解中值滤波的工作原理和MATLAB编程...

    基于改进P-M 模型与加权复合型中值滤波的非球面干涉图去噪方法

    针对非球面干涉图在预处理过程中去噪的问题,提出了一种基于改进P-M 模型与加权复合型中值滤波相结合的去噪方法。分析了P-M 模型,指出了该模型在去噪中的缺点并且提出了相应的改进模型。讨论了经典的中值滤波模型,...

    论文研究-一种基于自适应的新型中值滤波算法.pdf

    针对基本微分进化算法在后期收敛速度慢,搜索能力差等问题,利用混沌搜索的随机性、遍历性以及对初值的敏感性等特性,提出了一种混合混沌搜索的微分进化算法——混沌微分进化算法。该算法既保持了基本微分进化算法...

    3x3中值滤波怎么计算过程-计算机视觉学习笔记8噪声与滤波 计算机视觉.pdf

    计算机视觉学习笔记8-噪声与滤波 计算机视觉中,图像噪声是一个非常重要的问题,噪声的产生会严重影响图像质量。为了解决这个问题,需要对图像进行滤波处理。滤波是一种可以有效去除图像噪声的方法。常见的滤波方法...

    Median-filteraMean-filter.zip_中值滤波 文档_图像增强实验_图像增强文档

    在图像处理领域,中值滤波器和均值滤波器是两种常用的技术,用于减小图像噪声和提高图像质量。这两个概念对于理解和应用图像增强至关重要。本篇将深入探讨这两种滤波方法及其在实际中的应用。 首先,我们来了解**...

    cuda立体匹配——中值滤波

    本课题采用中值滤波器对初步得到的视差图进行平滑,中值滤波是一种非线性滤波方法,可以有效去除椒盐噪声,同时保持边缘信息的完整性。 CUDA的引入使得这些计算可以在GPU上并行执行,极大地提高了运算速度。C++编程...

    [opencv] 简单线性与非线性滤波-方框+均值+高斯+中值+双边滤波

    在图像处理领域,滤波是一种常见的操作,用于改善图像质量或提取特定信息。...在压缩包文件"016 简单线性与非线性滤波-方框+均值+高斯+中值+双边滤波"中,你将找到这些滤波方法的实现示例,可供学习和参考。

    论文研究-一种新型的自适应模糊中值滤波算法.pdf

    通过比较滤波窗口内像素点的灰度值与像素点灰度值的均值定义了模糊滤波系数,利用此模糊滤波系数对滤波方法进行加权,得到一种加权中值滤波器。通过对小窗口内的灰度值不等于最大灰度值和最小灰度值的像素点的检测...

    image-denoising.rar_小波中值滤波_小波滤波_小波阈值滤波_高斯滤波去噪_高斯滤波器

    3. **中值滤波**:中值滤波是一种非线性滤波方法,它用窗口内像素值的中值替换中心像素值,特别适合去除椒盐噪声,但在处理高斯噪声时可能不如均值或高斯滤波。 4. **自适应中值滤波**:自适应中值滤波根据局部图像...

    S7-200 中值滤波库

    这种滤波方法的核心思想是将信号序列中的每个元素替换为其周围邻域内的中值。相比于平均滤波,中值滤波器更能保留图像或信号的边缘,因为平均操作会平滑所有特征,包括有用的边缘信息。 在S7-200 PLC中,模拟量输入...

    STM32F103VE_sonic_t0-master(完成滤波卡尔曼、中值法).zip

    利用野火开发板STM32F103VET6 +超声波HC-SR04 完成倒车雷达功能,距离越近蜂鸣器频率越高,距离值通过中值滤波算法,以及卡尔曼滤波算法,算法系数可调,也可用在ADC数据采集滤波上,或者其他原始数据采集上

    几种中值滤波去噪方法分析.docx

    "几种中值滤波去噪方法分析" 中值滤波是一种非线性滤波方法,广泛应用于数字图像去噪处理。该方法可以有效地去除椒盐噪声,保护图像的边缘和细节信息。 标准中值滤波方法是最简单有效的去除椒盐噪声的方法之一。该...

    图像滤波算法——均值、中值、高斯 图像滤波算法.pdf

    图像滤波算法——均值、中值、高斯图像滤波算法 图像滤波算法是图像处理中的一个重要步骤,它可以去除图像中的噪声和瑕疵,提高图像的质量。本文将介绍三种常用的图像滤波算法:均值滤波、中值滤波和高斯滤波。 一...

    高等数学教学设计——中值定理.doc

    高等数学教学设计——中值定理 本资源是高等数学教学设计的单元教学计划,旨在帮助学生掌握微分中值定理的知识和技能。教学目标包括理解和掌握罗尔定理、拉格朗日定理、柯西中值定理和洛比达法,以及判断函数的单调...

Global site tag (gtag.js) - Google Analytics