How to find TOP 3 in each group?

How to find TOP 3 in each group?

Execute the following Microsoft SQL Server T-SQL example scripts in SSMS Query Editor to demonstrate the TOP function usage in TOP n per group and other queries.

The FORMAT and CONCAT functions are new in SQL Server 2012.

USE AdventureWorks2008;

 

-- TOP 3 / TOP 10 / TOP n per group - QUICK SYNTAX

;WITH CTE

     AS (SELECT PSC.Name     AS SubCategory,

                P.Name       AS ProductName,

                ROW_NUMBER()

                  OVER(PARTITION BY P.ProductSubcategoryID

                        ORDER BY P.ProductID) AS RowID

         FROM   Production.ProductSubcategory PSC

                LEFT JOIN Production.Product P -- or INNER JOIN

                  ON P.ProductSubcategoryID = PSC.ProductSubcategoryID)

SELECT Subcategory,

       ProductName

FROM   CTE

WHERE  RowID <= 3

ORDER BY Subcategory,ProductName;

------------

 

------------
-- TOP is indirectly impliemented by the use of GROUP BY within a CTE
-- to create summary report TOP n query.
------------
-- FIND TOP 3 in each group - SQL top group by - SQL group by top n

-- SQL top - SQL over partition by - SQL cte - Common Table Expression

DECLARE @TopN tinyint = 3;

WITH cteTopNSales

     AS (SELECT   Row_number()

                    OVER(PARTITION BY sod.ProductID

                    ORDER BY Sum(sod.LineTotal) DESC) AS SeqNo,

                  CONCAT(FirstName, ' ', LastName)    AS [Name],

                  ProductName = p.Name,

                  FORMAT(Convert(MONEY,Sum(sod.LineTotal)),

                       'c','en-US') AS TotalBySalesPerson,

                  p.ProductNumber,

                  sod.ProductID

         FROM     Sales.SalesOrderDetail AS sod

                  INNER JOIN Production.Product AS p

                    ON sod.ProductID = p.ProductID

                  INNER JOIN Sales.SalesOrderHeader soh

                    ON sod.SalesOrderID = soh.SalesOrderID

                  INNER JOIN Person.Person c

                    ON soh.SalesPersonID = c.BusinessEntityID

         WHERE    soh.SalesPersonID IS NOT NULL

         GROUP BY FirstName + ' ' + LastName,

                  sod.ProductID,

                  p.ProductNumber,

                  p.Name)

SELECT   *

FROM     cteTopNSales cte

-- Display top 3 for each group 

WHERE SeqNo <= @TopN

-- SeqNo = 2 will find the second highest in each group

ORDER BY ProductID,

         SeqNo

GO

/* Partial results

    TotBySP = TotalBySalesPerson
    ProdNo = ProductNumber 

SeqNo Name              ProductName             TotBySP     ProdNo      ProductID

1     Linda Mitchell    Sport-100 Helmet, Red   $10,859.64  HL-U509-R         707

2     Jillian Carson    Sport-100 Helmet, Red   $10,410.01  HL-U509-R         707

3     Jae Pak           Sport-100 Helmet, Red   $9,890.47   HL-U509-R         707

1     Linda Mitchell    Sport-100 Helmet, Black $11,677.54  HL-U509           708

2     Jillian Carson    Sport-100 Helmet, Black $11,673.99  HL-U509           708

3     Jae Pak           Sport-100 Helmet, Black $10,129.46  HL-U509           708

1     Tsvi Reiter       Mountain Bike Socks, M  $1,141.80   SO-B909-M         709

2     Linda Mitchell    Mountain Bike Socks, M  $875.21     SO-B909-M         709

3     Jillian Carson    Mountain Bike Socks, M  $826.79     SO-B909-M         709

*/

------------

 

-- SELECT TOP 10 per group - CTE ORDER BY ROW_NUMBER PARTITION BY - SS 2005 and on

;WITH CTE AS

(SELECT   TOP 1 WITH TIES PSC.Name AS SubCategory,

                          P.Name   AS ProductName

 FROM     Production.ProductSubcategory PSC

          INNER JOIN Production.Product P   -- alternate LEFT JOIN

            ON P.ProductSubcategoryID = PSC.ProductSubcategoryID

 ORDER BY ROW_NUMBER()

           OVER(PARTITION BY P.ProductSubcategoryID

           ORDER BY ProductID) /(10+1) )

 SELECT * FROM CTE

 ORDER BY Subcategory,

          ProductName;

------------

 

------------
-- The following script shows a direct use of the SQL Server TOP function.
------------
-- Create an empty table with TOP 0 - SQL TOP function

SELECT TOP (0) * INTO #ProductX

FROM Production.Product

GO

-- (0 row(s) affected)

SELECT COUNT(*) FROM #ProductX

GO

-- 0

DROP TABLE #ProductX

------------

 

 

-- TOP 10 per group - LEFT JOIN subquery  - All versions of SQL Server

SELECT   PSC.Name AS SubCategory,

         P.Name   AS ProductName

FROM     Production.ProductSubcategory PSC

         LEFT JOIN Production.Product P

           ON P.ProductSubcategoryID = PSC.ProductSubcategoryID

WHERE    P.ProductID IN(SELECT   TOP 10 ProductID

                         FROM     Production.Product P

                         WHERE    P.ProductSubcategoryID = PSC.ProductSubcategoryID

                         ORDER BY P.ProductID DESC)

ORDER BY Subcategory,

         ProductName;

------------

 

-- TOP 10 per group SELF JOIN subquery  - All versions of SQL Server

SELECT   Subcategory,

         ProductName

FROM     (SELECT PSC.Name AS SubCategory,

                 P1.Name  AS ProductName,

                 (SELECT COUNT(* )

                  FROM   Production.ProductSubcategory PSC

                         LEFT JOIN Production.Product P2

                           ON P2.ProductSubcategoryID = PSC.ProductSubcategoryID

                  WHERE  P2.ProductSubcategoryID = P1.ProductSubcategoryID

                         AND P2.ProductID <= P1.ProductID) AS RowID

          FROM   Production.ProductSubcategory PSC

                 LEFT JOIN Production.Product P1

                   ON P1.ProductSubcategoryID = PSC.ProductSubcategoryID) AS X

WHERE    RowID <= 10

ORDER BY Subcategory,

         ProductName;

------------


http://www.sqlusa.com/bestpractices2008/top-group-by/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目标检测(Object Detection)是计算机视觉领域的一个核心问题,其主要任务是找出图像中所有感兴趣的目标(物体),并确定它们的类别和位置。以下是对目标检测的详细阐述: 一、基本概念 目标检测的任务是解决“在哪里?是什么?”的问题,即定位出图像中目标的位置并识别出目标的类别。由于各类物体具有不同的外观、形状和姿态,加上成像时光照、遮挡等因素的干扰,目标检测一直是计算机视觉领域最具挑战性的任务之一。 二、核心问题 目标检测涉及以下几个核心问题: 分类问题:判断图像中的目标属于哪个类别。 定位问题:确定目标在图像中的具体位置。 大小问题:目标可能具有不同的大小。 形状问题:目标可能具有不同的形状。 三、算法分类 基于深度学习的目标检测算法主要分为两大类: Two-stage算法:先进行区域生成(Region Proposal),生成有可能包含待检物体的预选框(Region Proposal),再通过卷积神经网络进行样本分类。常见的Two-stage算法包括R-CNN、Fast R-CNN、Faster R-CNN等。 One-stage算法:不用生成区域提议,直接在网络中提取特征来预测物体分类和位置。常见的One-stage算法包括YOLO系列(YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5等)、SSD和RetinaNet等。 四、算法原理 以YOLO系列为例,YOLO将目标检测视为回归问题,将输入图像一次性划分为多个区域,直接在输出层预测边界框和类别概率。YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。其网络结构通常包含多个卷积层和全连接层,通过卷积层提取图像特征,通过全连接层输出预测结果。 五、应用领域 目标检测技术已经广泛应用于各个领域,为人们的生活带来了极大的便利。以下是一些主要的应用领域: 安全监控:在商场、银行
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值