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

感兴趣的小伙伴,下面一起跟随编程之家 jb51.cc的小编两巴掌来看看吧!

代码如下:


/****** 创建表  ******/     
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-03-03 03:03:03')     
Insert INTO [Table](Y, X) values('BBB', '2007-01-01 01:01:01')     
Insert INTO [Table](Y, X) values('DDD', 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,  
[Y] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL ,  
[X] [smalldatetime] NOT NULL  
) ON [PRIMARY]  
GO  
--插入数据  
Insert INTO [Table](Y, '2007-02-02 02:02:02')  
Insert INTO [Table](Y, '2007-03-03 03:03:03')  
Insert INTO [Table](Y, '2007-01-01 01:01:01')  
Insert INTO [Table](Y, '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, 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 .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列在建立索引,可以大大优化查询速度。

相关文章

(一)日志传送架构 (1.1)相关服务器 主服务器 :用于生产的服务器,上面运行这生产SQL Server数据库...
(一)事故背景 最近在SQL Server 2012生产数据库上配置完事物复制(发布订阅)后,生产数据库业务出现了...
(一)测试目的 目前公司使用的SQL SERVER 2012高可用环境为主备模式,其中主库可执行读写操作,备库既...
(一)背景个人在使用sql server时,用到了sql server的发布订阅来做主从同步,类似MySQL的异步复制。在...
UNION和OR谓词 找出 product 和 product2 中售价高于 500 的商品的基本信息. select * from product wh...
datawhale组队学习task03