广

MSSQL

  • MYSQL
  • MSSQL
  • Redis
  • MongoDB
  • oracle数据库
  • 数据管理

    一条语句简单解决“每个Y的最新X”的经典sql语句

    2018-04-16 10:57:25 次阅读 稿源:互联网
    零七网广告
    全网推广平台,软文发布
    代码如下:

    /****** 创建表  ******/    
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Table]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)    
    drop table [dbo].[Table]    
    GO    
    Create TABLE [dbo].[Table] (    
    [ID] [int] IDENTITY (1, 1) NOT NULL ,    
    [Y] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,    
    [X] [smalldatetime] NOT NULL   
    ) ON [PRIMARY]    
    GO    
    --插入数据    
    Insert INTO [Table](Y, X) values('CCC', '2007-02-02 02:02:02')    
    Insert INTO [Table](Y, X) values('AAA', '2007-02-02 02:02:02')    
    Insert INTO [Table](Y, X) values('AAA', '2007-03-03 03:03:03')    
    Insert INTO [Table](Y, X) values('BBB', '2007-01-01 01:01:01')    
    Insert INTO [Table](Y, X) values('BBB', '2007-02-02 02:02:02')    
    Insert INTO [Table](Y, X) values('BBB', '2007-03-03 03:03:03')    
    Insert INTO [Table](Y, X) values('CCC', '2007-01-01 01:01:01')    
    Insert INTO [Table](Y, X) values('AAA', '2007-01-01 01:01:01')    
    Insert INTO [Table](Y, X) values('CCC', '2007-03-03 03:03:03')    
    Insert INTO [Table](Y, X) values('DDD', '2007-01-01 01:01:01')    
    Insert INTO [Table](Y, X) values('DDD', '2007-02-02 02:02:02')    
    Insert INTO [Table](Y, X) values('DDD', '2007-03-03 03:03:03')    
    Insert INTO [Table](Y, X) values('EEE', '2007-01-01 01:01:01')    
    Insert INTO [Table](Y, X) values('EEE', '2007-02-02 02:02:02')    
    Insert INTO [Table](Y, X) values('EEE', '2007-03-03 03:03:03')    
    GO   

    /****** 创建表  ******/ 
    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Table]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) 
    drop table [dbo].[Table] 
    GO 
    Create TABLE [dbo].[Table] ( 
    [ID] [int] IDENTITY (1, 1) NOT NULL , 
    [Y] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL , 
    [X] [smalldatetime] NOT NULL 
    ) ON [PRIMARY] 
    GO 
    --插入数据 
    Insert INTO [Table](Y, X) values('CCC', '2007-02-02 02:02:02') 
    Insert INTO [Table](Y, X) values('AAA', '2007-02-02 02:02:02') 
    Insert INTO [Table](Y, X) values('AAA', '2007-03-03 03:03:03') 
    Insert INTO [Table](Y, X) values('BBB', '2007-01-01 01:01:01') 
    Insert INTO [Table](Y, X) values('BBB', '2007-02-02 02:02:02') 
    Insert INTO [Table](Y, X) values('BBB', '2007-03-03 03:03:03') 
    Insert INTO [Table](Y, X) values('CCC', '2007-01-01 01:01:01') 
    Insert INTO [Table](Y, X) values('AAA', '2007-01-01 01:01:01') 
    Insert INTO [Table](Y, X) values('CCC', '2007-03-03 03:03:03') 
    Insert INTO [Table](Y, X) values('DDD', '2007-01-01 01:01:01') 
    Insert INTO [Table](Y, X) values('DDD', '2007-02-02 02:02:02') 
    Insert INTO [Table](Y, X) values('DDD', '2007-03-03 03:03:03') 
    Insert INTO [Table](Y, X) values('EEE', '2007-01-01 01:01:01') 
    Insert INTO [Table](Y, X) values('EEE', '2007-02-02 02:02:02') 
    Insert INTO [Table](Y, X) values('EEE', '2007-03-03 03:03:03') 

    GO解决“每个Y的最新X”经典SQL问题:以下几种方法真是八仙过海
    代码如下:


    Select ID, Y, X   
    FROM [Table] T1   
    Where (NOT EXISTS   
    (Select 1   
    FROM [Table] T2   
    Where (T2.Y = T1 .Y) AND (T2.X > T1 .X or  
    T2.X = T1 .X AND T2.ID > T1 .ID)))   
    /*****************************************************************************/   
    Select *   
    FROM [Table]   
    Where ID IN  
    (Select MAX(T1.ID)   
    FROM [Table] T1 JOIN  
    (Select y, MAX(x) x   
    FROM [Table]   
    GROUP BY y) T2 ON T1.Y = T2.Y AND T1.x = T2.x   
    GROUP BY T1.y)   
    /*****************************************************************************/   
    Select T .ID, T .Y, T .X   
    FROM [Table] T INNER JOIN  
    (Select MAX(T1.ID) AS ID   
    FROM [Table] T1 JOIN  
    (Select y, MAX(x) x   
    FROM [Table]   
    GROUP BY y) T2 ON T1.Y = T2.Y AND T1.x = T2.x   
    GROUP BY T1.y) T2 ON T .ID = T2.ID   
    /*****************************************************************************/   
    Select *   
    FROM [Table] T1   
    Where ID IN  
    (Select TOP 1 ID   
    FROM [Table]   
    Where Y = T1.Y   
    orDER BY X DESC)   
    /*****************************************************************************/   
    Select *   
    FROM [Table] T1   
    Where (ID =   
    (Select TOP 1 ID   
    FROM [Table]   
    Where Y = T1.Y   
    orDER BY X DESC, ID DESC))   
    /*****************************************************************************/  

    /*****************************************************************************/
    Select ID, Y, X
    FROM [Table] T1
    Where (NOT EXISTS
    (Select 1
    FROM [Table] T2
    Where (T2.Y = T1 .Y) AND (T2.X > T1 .X or
    T2.X = T1 .X AND T2.ID > T1 .ID)))
    /*****************************************************************************/
    Select *
    FROM [Table]
    Where ID IN
    (Select MAX(T1.ID)
    FROM [Table] T1 JOIN
    (Select y, MAX(x) x
    FROM [Table]
    GROUP BY y) T2 ON T1.Y = T2.Y AND T1.x = T2.x
    GROUP BY T1.y)
    /*****************************************************************************/
    Select T .ID, T .Y, T .X
    FROM [Table] T INNER JOIN
    (Select MAX(T1.ID) AS ID
    FROM [Table] T1 JOIN
    (Select y, MAX(x) x
    FROM [Table]
    GROUP BY y) T2 ON T1.Y = T2.Y AND T1.x = T2.x
    GROUP BY T1.y) T2 ON T .ID = T2.ID
    /*****************************************************************************/
    Select *
    FROM [Table] T1
    Where ID IN
    (Select TOP 1 ID
    FROM [Table]
    Where Y = T1.Y
    orDER BY X DESC)
    /*****************************************************************************/
    Select *
    FROM [Table] T1
    Where (ID =
    (Select TOP 1 ID
    FROM [Table]
    Where Y = T1.Y
    orDER BY X DESC, ID DESC))

    /*****************************************************************************
    /效率嘛,在不同的字段建立索引速度都不尽相同,使用者见仁见智了. 
    第一种方法速度在各方面都不错,而且在Y列在建立索引,可以大大优化查询速度。

    零七网部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与零七网进行文章共享合作。

    零七网广告
    零七网广告
    零七网广告
    零七网广告