• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    一条语句简单解决“每个Y的最新X”的经典sql语句
    复制代码 代码如下:

    /****** 创建表  ******/    
    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列在建立索引,可以大大优化查询速度。
    上一篇:在查询结果中添加一列表示记录的行数的sql语句
    下一篇:LINQ to SQL:处理char(1)字段的方式会引起全表扫描问题
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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