这句SQL语句该如何写,
这句SQL语句该怎么写,请教高手!
数据库里有每个用户发布的产品,每个用户都可以发布多条产品。产品发布后用户在后台可一次更新一条产品的发布时间,也可以一键更新全部产品的发布时间,此时用户发布的产品全部时间都相同,如下表中的用户ID:9,
我现在想从这个表中每个对应用户都只提取出一条产品显示,提取出的产品要求:1、是用户最新发布或更新的那条产品,
2、如果用户是一键更新过的那条产品,所有产品时间都是相同的,那么在这样情况下就提取它ID最大产品,请问该如何写这句SQL语句
产品编号 对应用户ID 发布时间
SMT_id dyid SMT_data
1 9 2012-4-12 14:33:36
2 11 2012-4-18 19:23:36
3 9 2012-4-12 14:33:36
4 9 2012-4-12 14:33:36
5 12 2012-5-19 19:23:36
6 11 2012-3-17 19:23:36
想要的结果
产品编号 对应用户ID 发布时间
SMT_id dyid SMT_data
5 12 2012-5-19 19:23:36
2 11 2012-4-18 19:23:36
4 9 2012-4-12 14:33:36
------解决方案--------------------
数据库里有每个用户发布的产品,每个用户都可以发布多条产品。产品发布后用户在后台可一次更新一条产品的发布时间,也可以一键更新全部产品的发布时间,此时用户发布的产品全部时间都相同,如下表中的用户ID:9,
我现在想从这个表中每个对应用户都只提取出一条产品显示,提取出的产品要求:1、是用户最新发布或更新的那条产品,
2、如果用户是一键更新过的那条产品,所有产品时间都是相同的,那么在这样情况下就提取它ID最大产品,请问该如何写这句SQL语句
产品编号 对应用户ID 发布时间
SMT_id dyid SMT_data
1 9 2012-4-12 14:33:36
2 11 2012-4-18 19:23:36
3 9 2012-4-12 14:33:36
4 9 2012-4-12 14:33:36
5 12 2012-5-19 19:23:36
6 11 2012-3-17 19:23:36
想要的结果
产品编号 对应用户ID 发布时间
SMT_id dyid SMT_data
5 12 2012-5-19 19:23:36
2 11 2012-4-18 19:23:36
4 9 2012-4-12 14:33:36
------解决方案--------------------
- SQL code
--> 测试数据:[tb] IF OBJECT_ID('[tb]') IS NOT NULL DROP TABLE [tb] GO CREATE TABLE [tb]([SMT_id] INT,[dyid] INT,[SMT_data] DATETIME) INSERT [tb] SELECT 1,9,'2012-4-12 14:33:36' UNION ALL SELECT 2,11,'2012-4-18 19:23:36' UNION ALL SELECT 3,9,'2012-4-12 14:33:36' UNION ALL SELECT 4,9,'2012-4-12 14:33:36' UNION ALL SELECT 5,12,'2012-5-19 19:23:36' UNION ALL SELECT 6,11,'2012-3-17 19:23:36' --------------开始查询-------------------------- --1 SELECT * FROM [tb] t WHERE NOT EXISTS(SELECT 1 FROM [tb] WHERE [SMT_data]=t.[SMT_data] AND [SMT_id]>t.[SMT_id]) AND NOT EXISTS(SELECT 1 FROM [tb] WHERE [dyid]=t.[dyid] AND [SMT_data]>t.[SMT_data]) --2 SELECT * FROM [tb] t WHERE [SMT_id]=(SELECT MAX([SMT_id]) FROM [tb] WHERE [SMT_data]=t.[SMT_data]) AND [SMT_data]=(SELECT MAX([SMT_data]) FROM [tb] WHERE [dyid]=t.[dyid]) ----------------结果---------------------------- /* SMT_id dyid SMT_data ----------- ----------- ----------------------- 2 11 2012-04-18 19:23:36.000 4 9 2012-04-12 14:33:36.000 5 12 2012-05-19 19:23:36.000 (3 行受影响) */
------解决方案--------------------
------解决方案--------------------
Select MAX(T1.SMT_id) As SMT_id , T1.dyid, T1.SMT_data
From @Tb T1 , (Select dyid, MAX(SMT_data) As SMT_data From @Tb
Group By dyid) T2
Where (T1.dyid = T2.dyid And T1.SMT_data = T2.SMT_data)
Group By T1.dyid, T1.SMT_data
Order By T1.SMT_data Desc