我错了,这回有格式了【大哥们帮帮忙,超难SQL】

和永恒有關 2010-11-02 03:36:59
软件版本:SQL2005
系统:xp2003


create table aa(
id int identity primary key,
bid int,
type varchar(60),
name varchar(60),
value varchar(60),
writedate datetime,
sysdate datetime
)
go

insert into aa
select 1429,'你好','好','aaa','2010-11-2','2010-11-3' union
select 1429,'你好','好','bbb','2010-11-6','2010-11-1' union
select 1429,'你好','不好','ccc','2010-11-2','2010-11-3' union
select 1429,'你好','好','ddd','2010-11-2','2010-11-4' union
select 1429,'你好','不好','eee','2010-11-2','2010-11-2' union
select 1429,'你好','好','fff',null,null union
select 1429,'你好','不好','ggg',null,null union
select 1429,'吃饭','吃','hhh',null,null union
select 1429,'你好','好','iii',null,null union
select 1429,'吃饭','吃','jjj',null,null union
select 1429,'你好','好','kkk',null,null union
select 1430,'喝水','喝','lll',null,null union
select 1430,'喝水',' 不喝','mmm',null,null
go


创建后表信息:
id bid type name value writedate sysdate
1 1429 吃饭 吃 hhh NULL NULL
2 1429 吃饭 吃 jjj NULL NULL
3 1429 你好 不好 ccc 2010-11-02 00:00:00.000 2010-11-03 00:00:00.000
4 1429 你好 不好 eee 2010-11-02 00:00:00.000 2010-11-02 00:00:00.000
5 1429 你好 不好 ggg NULL NULL
6 1429 你好 好 aaa 2010-11-02 00:00:00.000 2010-11-03 00:00:00.000
7 1429 你好 好 bbb 2010-11-06 00:00:00.000 2010-11-01 00:00:00.000
8 1429 你好 好 ddd 2010-11-02 00:00:00.000 2010-11-04 00:00:00.000
9 1429 你好 好 fff NULL NULL
10 1429 你好 好 iii NULL NULL
11 1429 你好 好 kkk NULL NULL
12 1430 喝水 不喝 mmm NULL NULL
13 1430 喝水 喝 lll NULL NULL


需要得到结果:
id bid type name value writedate sysdate
2 1429 吃饭 吃 jjj NULL NULL
3 1429 你好 不好 ccc 2010-11-02 00:00:00.000 2010-11-03 00:00:00.000
7 1429 你好 好 bbb 2010-11-06 00:00:00.000 2010-11-01 00:00:00.000


问题描述:
首先肯定是去重复。但有条件, 大家注意 writeDate和sysDate
1根据writeDate去重复得到最大日期。
2如果得到两条writeDate相同的数据,那么判定sysDate取出最大的。
3如果writeDate和sysdate都为null,那么根据取出id最大的那条

拜谢
...全文
189 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
abuying 2010-11-02
  • 打赏
  • 举报
回复
create table #tb(
id int identity primary key,
bid int,
type varchar(20),
name varchar(20),
value varchar(20),
writedate datetime,
sysdate datetime
)
go

insert into #tb
select 1429,'你好','好','aaa','2010-11-2','2010-11-3' union
select 1429,'你好','好','bbb','2010-11-6','2010-11-1' union
select 1429,'你好','不好','ccc','2010-11-2','2010-11-3' union
select 1429,'你好','好','ddd','2010-11-2','2010-11-4' union
select 1429,'你好','不好','eee','2010-11-2','2010-11-2' union
select 1429,'你好','好','fff',null,null union
select 1429,'你好','不好','ggg',null,null union
select 1429,'吃饭','吃','hhh',null,null union
select 1429,'你好','好','iii',null,null union
select 1429,'吃饭','吃','jjj',null,null union
select 1429,'你好','好','kkk',null,null union
select 1430,'喝水','喝','lll',null,null union
select 1430,'喝水',' 不喝','mmm',null,null
go
;with cte as
(
select * from #tb where
not exists(select 1 from #tb t where #tb.bid=t.bid and #tb.type=t.type and #tb.name=t.name and (#tb.writedate<t.writedate or #tb.writedate is null))
),
cte2 as(
select * from #tb where writedate is null and sysdate is null
and not exists(select 1 from #tb t where #tb.bid=t.bid and #tb.type=t.type and #tb.name=t.name and t.writedate is not null)
)
select * from
(select *,rn=row_number() over(partition by bid,type,name order by writedate,sysdate desc)
from cte
) n where rn=1
union all
select * from
(select *,rn=row_number() over(partition by bid,type,name order by id desc)
from cte2
) n where rn=1
order by id asc
id bid type name value writedate sysdate rn
----------- ----------- -------------------- -------------------- -------------------- ----------------------- ----------------------- --------------------
2 1429 吃饭 吃 jjj NULL NULL 1
3 1429 你好 不好 ccc 2010-11-02 00:00:00.000 2010-11-03 00:00:00.000 1
7 1429 你好 好 bbb 2010-11-06 00:00:00.000 2010-11-01 00:00:00.000 1
12 1430 喝水 不喝 mmm NULL NULL 1
13 1430 喝水 喝 lll NULL NULL 1

(5 行受影响)
和永恒有關 2010-11-02
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 vidor 的回复:]
SQL code
select * from aa a where id = (select top 1 id from aa where bid=a.bid and type=a.type and name=a.name order by writeDate desc, sysDate desc, id desc)

/*
id bid type ……
[/Quote]

非常感谢你朋友。同时感谢,17,18楼的朋友
还有帮忙顶的朋友们。
和永恒有關 2010-11-02
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 htl258 的回复:]
SQL code
--> 生成测试数据表: [tb]
IF OBJECT_ID('[aa]') IS NOT NULL
DROP TABLE aa
GO
create table aa(
id int identity primary key,
bid int,
type varchar(60),
name varchar(60),
……
[/Quote]

道友到底怎么看不出规律了。 上面1,2,3写的很清楚了阿
htl258_Tony 2010-11-02
  • 打赏
  • 举报
回复
--> 生成测试数据表: [tb]
IF OBJECT_ID('[aa]') IS NOT NULL
DROP TABLE aa
GO
create table aa(
id int identity primary key,
bid int,
type varchar(60),
name varchar(60),
value varchar(60),
writedate datetime,
sysdate datetime
)
go

insert into aa
select 1429,'你好','好','aaa','2010-11-2','2010-11-3' union
select 1429,'你好','好','bbb','2010-11-6','2010-11-1' union
select 1429,'你好','不好','ccc','2010-11-2','2010-11-3' union
select 1429,'你好','好','ddd','2010-11-2','2010-11-4' union
select 1429,'你好','不好','eee','2010-11-2','2010-11-2' union
select 1429,'你好','好','fff',null,null union
select 1429,'你好','不好','ggg',null,null union
select 1429,'吃饭','吃','hhh',null,null union
select 1429,'你好','好','iii',null,null union
select 1429,'吃饭','吃','jjj',null,null union
select 1429,'你好','好','kkk',null,null union
select 1430,'喝水','喝','lll',null,null union
select 1430,'喝水',' 不喝','mmm',null,null
go


SELECT id,bid,TYPE,name,VALUE,writedate,sysdate
FROM (
SELECT rn=ROW_NUMBER()OVER(PARTITION BY bid,type,name ORDER BY writedate desc,sysdate DESC,id desc),*
FROM aa a
) t
WHERE rn=1
ORDER BY id
/*
id bid TYPE name VALUE writedate sysdate
----------- ----------- ------------------------------------------------------------ ------------------------------------------------------------ ------------------------------------------------------------ ----------------------- -----------------------
2 1429 吃饭 吃 jjj NULL NULL
3 1429 你好 不好 ccc 2010-11-02 00:00:00.000 2010-11-03 00:00:00.000
7 1429 你好 好 bbb 2010-11-06 00:00:00.000 2010-11-01 00:00:00.000
12 1430 喝水 不喝 mmm NULL NULL
13 1430 喝水 喝 lll NULL NULL

(5 行受影响)

*/
没最终看出规律
juge001 2010-11-02
  • 打赏
  • 举报
回复

IF OBJECT_ID('aa') IS NOT NULL
DROP TABLE aa

create table aa(
id int identity primary key,
bid int,
type varchar(20),
name varchar(20),
value varchar(20),
writedate datetime,
sysdate datetime
)
go

insert into aa
select 1429,'你好','好','aaa','2010-11-2','2010-11-3' union
select 1429,'你好','好','bbb','2010-11-6','2010-11-1' union
select 1429,'你好','不好','ccc','2010-11-2','2010-11-3' union
select 1429,'你好','好','ddd','2010-11-2','2010-11-4' union
select 1429,'你好','不好','eee','2010-11-2','2010-11-2' union
select 1429,'你好','好','fff',null,null union
select 1429,'你好','不好','ggg',null,null union
select 1429,'吃饭','吃','hhh',null,null union
select 1429,'你好','好','iii',null,null union
select 1429,'吃饭','吃','jjj',null,null union
select 1429,'你好','好','kkk',null,null union
select 1430,'喝水','喝','lll',null,null union
select 1430,'喝水',' 不喝','mmm',null,null
go



SELECT * FROM aa t1
WHERE id IN(

SELECT TOP 1 id FROM
aa
WHERE t1.bid=bid AND t1.[name]=NAME AND t1.[type]=type
ORDER BY bid,TYPE,NAME,writedate DESC,sysdate DESC ,id DESC

)


--->结果

id bid type name value writedate sysdate
----------- ----------- -------------------- -------------------- -------------------- ----------------------- -----------------------
2 1429 吃饭 吃 jjj NULL NULL
3 1429 你好 不好 ccc 2010-11-02 00:00:00.000 2010-11-03 00:00:00.000
7 1429 你好 好 bbb 2010-11-06 00:00:00.000 2010-11-01 00:00:00.000
12 1430 喝水 不喝 mmm NULL NULL
13 1430 喝水 喝 lll NULL NULL



和永恒有關 2010-11-02
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 kevinwen0413 的回复:]
你给的结果和你描述不对,9-13这些条两个事件都是null 怎么取最大,根据bid分组还是什么?
[/Quote]

朋友你看清楚我写的啊
3如果writeDate和sysdate都为null,那么根据取出id最大的那条

就是说取出max(ID)
和永恒有關 2010-11-02
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 wxf163 的回复:]
为什么要ID3 不要ID6 或8呢?
[/Quote]

ID3 是
id bid type name value writedate sysdate
3 1429 你好 不好 ccc 2010-11-02 00:00:00.000 2010-11-03 00:00:00.000

ID6 是
id bid type name value writedate sysdate
6 1429 你好 好 aaa 2010-11-02 00:00:00.000 2010-11-03 00:00:00.000

id bid type name value writedate sysdate
8 1429 你好 好 ddd 2010-11-02 00:00:00.000 2010-11-04 00:00:00.000


首先他们Name就不一样啊。ID3是不好。6,8是好。我要取不好的肯定不会要6,8
Xiao_Ai_Mei 2010-11-02
  • 打赏
  • 举报
回复
根据什么分组的?
kevn 2010-11-02
  • 打赏
  • 举报
回复
你给的结果和你描述不对,9-13这些条两个事件都是null 怎么取最大,根据bid分组还是什么?
和永恒有關 2010-11-02
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 vidor 的回复:]
SQL code
select * from aa a where id = (select top 1 id from aa where bid=a.bid and type=a.type and name=a.name order by writeDate desc, sysDate desc, id desc)

/*
id bid type ……
[/Quote]

道友我去试试,ok就结贴
王向飞 2010-11-02
  • 打赏
  • 举报
回复
为什么要ID3 不要ID6 或8呢?
和永恒有關 2010-11-02
  • 打赏
  • 举报
回复
和永恒有關 2010-11-02
  • 打赏
  • 举报
回复
Vidor 2010-11-02
  • 打赏
  • 举报
回复
select * from aa a where id = (select top 1 id from aa where bid=a.bid and type=a.type and name=a.name order by writeDate desc, sysDate desc, id desc)

/*
id bid type name value writedate sysdate
----------- ----------- ------------------------------------------------------------ ------------------------------------------------------------ ------------------------------------------------------------ ----------------------- -----------------------
2 1429 吃饭 吃 jjj NULL NULL
3 1429 你好 不好 ccc 2010-11-02 00:00:00.000 2010-11-03 00:00:00.000
7 1429 你好 好 bbb 2010-11-06 00:00:00.000 2010-11-01 00:00:00.000
12 1430 喝水 不喝 mmm NULL NULL
13 1430 喝水 喝 lll NULL NULL

(5 行受影响)

*/
和永恒有關 2010-11-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 xiao_ai_mei 的回复:]
不能再顶了吧,傻了吧?我帮你再顶下
[/Quote]

0.0 蛋疼 ,谢了道友
Xiao_Ai_Mei 2010-11-02
  • 打赏
  • 举报
回复
不能再顶了吧,傻了吧?我帮你再顶下
和永恒有關 2010-11-02
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 juge001 的回复:]
那如果writeDate为既有Null又有不null的,是不是取不为NUll就行了
[/Quote]

嗯嗯。对滴
juge001 2010-11-02
  • 打赏
  • 举报
回复
那如果writeDate为既有Null又有不null的,是不是取不为NUll就行了
和永恒有關 2010-11-02
  • 打赏
  • 举报
回复
和永恒有關 2010-11-02
  • 打赏
  • 举报
回复
加载更多回复(1)

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧