zoukankan      html  css  js  c++  java
  • SQL Server中使用SQL语句取各分类中的前几条记录

    本文非原创,仅根据网上查询结果按自己的表结构做了一下整理。因分辨不出哪个是原创,链接就不加了。

    建立表结构如下:

    CREATE table [dbo].[tmp_Trans](
    ID     int  identity,
    PO_NO             varchar(20)          null,
    PO_Itemno            varchar(20)          null,
    Qty                  numeric(18,6)        null,
    Trans_Date           datetime             null,
    Doc_no               varchar(20)          null
    )

    要求取相同PO_NO按Trans_Date倒序排序的前两条记录。

    1.Where子句嵌套SELECT的方式。在嵌套的SELECT语句中可以与主表的字段相关联,达到分类的目的。

    这种方式又有三种写法:

    1)如果表中有主键,可以用IN的方式。

    SELECT * FROM tmp_Trans t
    WHERE ID IN(
     SELECT TOP 2 ID
     FROM tmp_Trans
     WHERE PO_NO=t.PO_NO
     ORDER BY Trans_Date DESC
    )

    2)如果没有主键,可以用判断在本条记录前有多少条记录的方式。但使用这种方式时如果遇到Trans_Date相同的情况会不准。如当存在Trans_Date最大的记录有三条时,这三条记录都会查出来。

    SELECT *
    FROM tmp_Trans t
    WHERE (
     SELECT COUNT(*)
     FROM tmp_Trans
     WHERE PO_NO=t.PO_NO AND Trans_Date>T.Trans_Date
    )<2

    3)使用CROSS APPLY子句。CROSS APPLY是SQL Server 2005后出来的新功能,用于在表连接时传入参数。

    SELECT DISTINCT b.*
    FROM tmp_Trans a
    CROSS APPLY
    (
     SELECT TOP(2) * FROM tmp_Trans WHERE a.PO_NO=PO_NO ORDER BY Trans_Date DESC
    ) b

    2.使用自动生成的Row Number。在使用 ROW_NUMBER()时可以用PARTITION BY子句来分组。建议使用这种方式。

    select * from (
     select ROW_NUMBER() OVER(PARTITION BY PO_NO ORDER BY Trans_Date DESC) as rowid,*
     from tmp_Trans
    ) a
    where rowid<=2

    查询结果:

  • 相关阅读:
    LeetCode Count of Range Sum
    LeetCode 158. Read N Characters Given Read4 II
    LeetCode 157. Read N Characters Given Read4
    LeetCode 317. Shortest Distance from All Buildings
    LeetCode Smallest Rectangle Enclosing Black Pixels
    LeetCode 315. Count of Smaller Numbers After Self
    LeetCode 332. Reconstruct Itinerary
    LeetCode 310. Minimum Height Trees
    LeetCode 163. Missing Ranges
    LeetCode Verify Preorder Serialization of a Binary Tree
  • 原文地址:https://www.cnblogs.com/dragonwlb/p/2600949.html
Copyright © 2011-2022 走看看