一條語(yǔ)句簡(jiǎn)單解決“每個(gè)Y的最新X”的經(jīng)典sql語(yǔ)句
/****** 創(chuàng)建表 ******/
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
--插入數(shù)據(jù)
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
/****** 創(chuàng)建表 ******/
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
--插入數(shù)據(jù)
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解決“每個(gè)Y的最新X”經(jīng)典SQL問(wèn)題:以下幾種方法真是八仙過(guò)海
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))
/*****************************************************************************
/效率嘛,在不同的字段建立索引速度都不盡相同,使用者見仁見智了.
第一種方法速度在各方面都不錯(cuò),而且在Y列在建立索引,可以大大優(yōu)化查詢速度。
相關(guān)文章
設(shè)置SQLServer數(shù)據(jù)庫(kù)中某些表為只讀的多種方法分享
在某些情況下需要把SQLServer的表設(shè)為只讀,下面舉出幾種方法,需要的朋友可以參考下2012-06-06阿拉伯?dāng)?shù)字轉(zhuǎn)大寫中文_財(cái)務(wù)常用sql存儲(chǔ)過(guò)程
需求:輸入阿拉伯?dāng)?shù)字,給出對(duì)應(yīng)的中文大寫,編寫為存儲(chǔ)過(guò)程或函數(shù)2008-10-10SQL SERVER先判斷視圖是否存在然后再創(chuàng)建視圖的語(yǔ)句
SQL SERVER中先判斷視圖是否存在,使用IF NOT EXISTS,然后再創(chuàng)建視圖,使用create view,整個(gè)過(guò)程如下2014-08-08SQL JOIN 連接詳細(xì)介紹及簡(jiǎn)單使用實(shí)例
這篇文章主要介紹了SQL JOIN 連接詳細(xì)介紹及簡(jiǎn)單使用實(shí)例的相關(guān)資料,需要的朋友可以參考下2017-01-01SQL Server誤區(qū)30日談 第24天 26個(gè)有關(guān)還原(Restore)的誤區(qū)
本系列文章一直所沒有觸及的就是有關(guān)”還原(Restore)”的話題,因?yàn)橐坏砍兜竭@個(gè)話題就會(huì)涉及大量的誤區(qū),多到我無(wú)法通過(guò)一篇文章說(shuō)完的地步。2013-01-01SQL Server中的Forwarded Record計(jì)數(shù)器影響IO性能的解決方法
這篇文章主要介紹了SQL Server中的Forwarded Record計(jì)數(shù)器影響IO性能的解決方法,需要的朋友可以參考下2014-07-07SQLServer導(dǎo)出數(shù)據(jù)到MySQL實(shí)例介紹
本文為大家詳細(xì)介紹下從SQLServer導(dǎo)出數(shù)據(jù)并將數(shù)據(jù)導(dǎo)入到MySQL,具體的實(shí)現(xiàn)如下,感興趣的朋友可以參考下哈2013-07-07