求一个查询语句

zhui22222 2013-07-03 09:11:20
表结构:
id,姓名,登记时间,登记内容

希望得到的查询结果是:
id,姓名,登记时间,登记内容,该姓名上一次的登记时间,上一次的登记内容

求教查询语句该怎么写?
...全文
432 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
lzw_0736 2013-07-03
  • 打赏
  • 举报
回复
字段有5、6项,這樣效率是否高一點? with a1 as ( select a.id,a.姓名,a.登记时间,a.登记内容, (select top 1 b.id from [表名] b where b.姓名=a.姓名 and b.id<a.id order by b.id desc) id_u from [表名] a ) select a.*,b.字段1,b.字段2,b.字段3......(後面省略) from a1 a left join [表名] b on a.id_u=b.id
zhui22222 2013-07-03
  • 打赏
  • 举报
回复
引用 7 楼 kissme168 的回复:
先分组获得集合,集合获得了最后一次登记的 LAST_RIGSTER 和C_NAME,再与原表JOIN, 条件是原表的登记时间=集合的登记时间 AND 原表的姓名=集合的姓名。这种方法是最安全可靠的,如果用ID来作为时间的先后,很不可靠,因为你不能保证ID大的一定是时间晚的。
不是最后一次登记,而是当前登记的上一次登记
zhui22222 2013-07-03
  • 打赏
  • 举报
回复
引用 1 楼 ap0405140 的回复:

select a.id,a.姓名,a.登记时间,a.登记内容,
       (select top 1 b.登记时间 
        from [表名] b 
        where b.姓名=a.姓名 and b.id<a.id 
        order by b.id desc) '上一次的登记时间',
       (select top 1 b.登记内容 
        from [表名] b 
        where b.姓名=a.姓名 and b.id<a.id 
        order by b.id desc) '上一次的登记内容'
 from [表名] a
可行,但是有个问题,因为表内数据量比较大,而且需要检索的上一次的字段有5、6项,用这个办法效率好像不高啊
kissme168 2013-07-03
  • 打赏
  • 举报
回复
先分组获得集合,集合获得了最后一次登记的 LAST_RIGSTER 和C_NAME,再与原表JOIN, 条件是原表的登记时间=集合的登记时间 AND 原表的姓名=集合的姓名。这种方法是最安全可靠的,如果用ID来作为时间的先后,很不可靠,因为你不能保证ID大的一定是时间晚的。
kissme168 2013-07-03
  • 打赏
  • 举报
回复
楼上用ID来判断时间先后 是不可靠的。正解如下:
如图 TBL_CONTENT
SELECT * FROM tbl_CONTENT RIGHT JOIN
( SELECT MAX(C_REGISTER) AS LAST_RIGSTER,C_NAME FROM tbl_CONTENT GROUP BY C_NAME)AS kk
ON tbl_CONTENT.C_NAME=kk.C_NAME AND tbl_CONTENT.C_REGISTER=kk.LAST_RIGSTER

结果如下:
smile_ps 2013-07-03
  • 打赏
  • 举报
回复
引用 1 楼 ap0405140 的回复:

select a.id,a.姓名,a.登记时间,a.登记内容,
       (select top 1 b.登记时间 
        from [表名] b 
        where b.姓名=a.姓名 and b.id<a.id 
        order by b.id desc) '上一次的登记时间',
       (select top 1 b.登记内容 
        from [表名] b 
        where b.姓名=a.姓名 and b.id<a.id 
        order by b.id desc) '上一次的登记内容'
 from [表名] a
正解!
lzw_0736 2013-07-03
  • 打赏
  • 举报
回复
最後一名糾正: select a.id,a.姓名,a.登记时间,a.登记内容,b.登记时间,b.登记内容 from a2 a left join 表 b on a.id_u=b.id order by a.id
lzw_0736 2013-07-03
  • 打赏
  • 举报
回复
with a1 as ( select id,姓名,登记时间,登记内容 from 表 a where id in ( SELECT TOP 1 RE FROM 表 where A.姓名=姓名 ORDER BY 登记时间 DESC ) ) a2 as ( select *, (select top 1 id from 表 where 姓名=a1.姓名 and 登记时间<a1.登记时间 order by 登记时间 desc) id_u from a1 ) select a.id,a.姓名,a.登记时间,a.登记内容,b.登记时间,b.登记内容 from a2 a inner join 表 b on a.id_u=b.id order by a.id
human_2000 2013-07-03
  • 打赏
  • 举报
回复
declare @a table(id int,[姓名] varchar(20),[登记时间] datetime,[登记内容] varchar(100)) insert into @a values(1,'a','2013-07-01','content1') insert into @a values(2,'a','2013-07-02','content2') insert into @a values(3,'a','2013-07-03','content3') insert into @a values(4,'b','2013-07-01','content1') insert into @a values(5,'b','2013-07-02','content2') insert into @a values(6,'b','2013-07-03','content3') select a.id,a.姓名,a.登记时间,a.登记内容,b.登记时间,b.登记内容 from @a a left join @a b on a.姓名=b.姓名 and b.id=(select max(id) from @a c where c.姓名=a.姓名 and c.id<a.id)
唐诗三百首 2013-07-03
  • 打赏
  • 举报
回复

select a.id,a.姓名,a.登记时间,a.登记内容,
       (select top 1 b.登记时间 
        from [表名] b 
        where b.姓名=a.姓名 and b.id<a.id 
        order by b.id desc) '上一次的登记时间',
       (select top 1 b.登记内容 
        from [表名] b 
        where b.姓名=a.姓名 and b.id<a.id 
        order by b.id desc) '上一次的登记内容'
 from [表名] a
SQL77 2013-07-03
  • 打赏
  • 举报
回复
select a.id,a.姓名,a.登记时间,a.登记内容, (select top 1 b.登记时间 from [表名] b where b.姓名=a.姓名 and (a.登记时间>登记时间 or a.登记时间=登记时间 and b.id<a.id) order by b.登记时间 desc,b.id desc) '上一次的登记时间', (select top 1 b.登记内容 from [表名] b where b.姓名=a.姓名 and (a.登记时间>登记时间 or a.登记时间=登记时间 and b.id<a.id) order by b.登记时间 desc,b.id desc) '上一次的登记内容' from [表名] a
  • 打赏
  • 举报
回复

 select a.*,b.* from
 (select top 1  id,[姓名],[登记时间],[登记内容] from  [表名] order by ID desc ) a,
 (select top 1 [登记时间] as 该姓名上一次的登记时间,[登记内容] as 上一次的登记内容 
from [表名] where ID<(select max(id) from [表名]) order by ID desc) b
520520123 2013-07-03
  • 打赏
  • 举报
回复
不会 15字 .....
kissme168 2013-07-03
  • 打赏
  • 举报
回复
这样再晕就没救了: SELECT MAX(CASE WHEN GROUP_ID=1 THEN ID ELSE NULL END)AS LAST_ID, 姓名, MAX(CASE WHEN GROUP_ID=2 THEN 登记时间 ELSE NULL END)AS 上一次登记时间, MAX(CASE WHEN GROUP_ID=1 THEN 登记时间 ELSE NULL END ) AS 本次登记时间, MAX(CASE WHEN GROUP_ID=2 THEN 登记内容 ELSE NULL END)AS 上一次的登记内容 FROM (SELECT TBL_TMP.*,(SELECT COUNT(*)+1 FROM 表 WHERE 姓名=TBL_TMP.姓名 and 登记时间>TBL_TMP.登记时间) AS GROUP_ID FROM 表 AS TBL_TMP) a WHERE a.GROUP_ID<=2 GROUP BY 姓名 ORDER BY LAST_ID
kissme168 2013-07-03
  • 打赏
  • 举报
回复
精简下: SELECT MAX(CASE WHEN group_id=1 THEN C_ID ELSE NULL END)AS LAST_ID, C_NAME , MAX(CASE WHEN group_id=2 THEN C_REGISTER ELSE NULL END)AS 上一次登录时间, MAX(CASE WHEN group_id=1 THEN c_register ELSE NULL END ) AS 本次登录时间, MAX(CASE WHEN group_id=2 THEN C_TEXT ELSE NULL END)AS 上一次的登记内容 FROM (select TBL_TMP.*,(select count(*)+1 from TBL_CONTENT where C_NAME=TBL_TMP.C_NAME and C_REGISTER>TBL_TMP.C_REGISTER) as group_id FROM TBL_CONTENT AS TBL_TMP) a WHERE a.group_id<=2 GROUP BY C_NAME ORDER BY LAST_ID
zhui22222 2013-07-03
  • 打赏
  • 举报
回复
引用 15 楼 ap0405140 的回复:

with t as
(select a.id,a.姓名,a.登记时间,a.登记内容,
       row_number() over(partition by a.姓名 order by a.id) 'rn'
 from [表名] a
)
select b.id,b.姓名,b.登记时间,b.登记内容,
       c.登记时间 '上一次的登记时间',
       c.登记内容 '上一次的登记内容'
 from t b
 left join t c on b.rn=c.rn+1
百度了一下,with as 好像不支持sqlserver2000,这边用不了啊
kissme168 2013-07-03
  • 打赏
  • 举报
回复
如果你的ID大的一定是时间大的,那么是可以优化下的。不过这个语句更具通用性,特别是在我公司的系统中有脱机功能,所以记录进来的时候不能保证时间最大的,ID就是最大的
kissme168 2013-07-03
  • 打赏
  • 举报
回复
引用 16 楼 zhui22222 的回复:
13楼整太复杂了,我的表id大的时间靠后是确定的,能不能根据这个简化下你的语句,看的头晕啊
你直接把字段和表 一个个的套不就行了啊。
zhui22222 2013-07-03
  • 打赏
  • 举报
回复
13楼整太复杂了,我的表id大的时间靠后是确定的,能不能根据这个简化下你的语句,看的头晕啊
唐诗三百首 2013-07-03
  • 打赏
  • 举报
回复

with t as
(select a.id,a.姓名,a.登记时间,a.登记内容,
       row_number() over(partition by a.姓名 order by a.id) 'rn'
 from [表名] a
)
select b.id,b.姓名,b.登记时间,b.登记内容,
       c.登记时间 '上一次的登记时间',
       c.登记内容 '上一次的登记内容'
 from t b
 left join t c on b.rn=c.rn+1
加载更多回复(4)

34,587

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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