咨询表
Qid    Name
1     Query1
2     Query2
3     Query3对话表
Did    Qid    Content            PostDatetime
1      2      有货吗?             2000/1/1 0:00
2      2      已售完,谢谢          2000/1/1 1:00
3      3      请问什么时候降价?     2000/12/31 0:00 
4      3      敬请期待,谢谢         2000/12/31 2:00对话表和咨询表以 Qid 关联。
假设当前时间是 2000/12/31 3:00 求一个SQL,找出所有符合条件的咨询,要求:
该咨询内的对话,最晚的一个对话的发布时间相距当前时间已经超出 48 小时。例如上面表中,Qid为2的咨询所关联的对话中,最后一个发布时间是 2000/1/1 1:00,相距当前时间 2000/12/31 3:00 超过48小时,而Qid 3 则尚未过期,因此执行结果应该是:Qid    Name
2     Query2谢谢!

解决方案 »

  1.   


    create table 咨询表(Qid int, Name varchar(20))insert into 咨询表
    select 1     ,'Query1' union all
    select 2     ,'Query2' union all
    select 3     ,'Query3'create table 对话表(Did  Int,Qid int,Content varchar(30),PostDatetime datetime)insert into 对话表
    select 1     , 2      ,'有货吗?'             ,'2000/1/1 0:00' union all
    select 2      ,2      ,'已售完,谢谢'          ,'2000/1/1 1:00' union all
    select 3     , 3      ,'请问什么时候降价?'     ,'2000/12/31 0:00' union all 
    select 4     , 3      ,'敬请期待,谢谢'        ,'2000/12/31 2:00'
    go
    select a.*
    from 咨询表 a
    inner join 
    (
    select qid
    from 对话表 
    group by qid
    having datediff(hour,MAX(PostDatetime),'2000/12/31 3:00')>48
    )b
     on a.qid = b.qid
    /*
    Qid Name
    2 Query2
    */
      

  2.   


    --找出最晚时间超出48小时的问题
    select * from [咨询表] a where a .qid in (select id from [对话表] group by qid having  DATEDIFF(dd,max(PostDateTime),GETDATE()))>=48
      

  3.   

    IF OBJECT_ID(N'咨询表',N'U') IS NOT NULL
    DROP TABLE 咨询表
    create table 咨询表(Qid int, Name varchar(20))insert into 咨询表
    select 1     ,'Query1' union all
    select 2     ,'Query2' union all
    select 3     ,'Query3'
     
    IF OBJECT_ID(N'对话表',N'U') IS NOT NULL
    DROP TABLE 对话表
    create table 对话表(Did  Int,Qid int,Content varchar(30),PostDatetime datetime)insert into 对话表
    select 1     , 2      ,'有货吗?'             ,'2000/1/1 0:00' union all
    select 2      ,2      ,'已售完,谢谢'          ,'2000/1/1 1:00' union all
    select 3     , 3      ,'请问什么时候降价?'     ,'2000/12/31 0:00' union all 
    select 4     , 3      ,'敬请期待,谢谢'        ,'2000/12/31 2:00'GO
     DECLARE @time  DATETIME
     SET  @time='2000/12/31 3:00'
     SELECT b.* FROM
     (
     SELECT   *,ROW_NUMBER() OVER(PARTITION BY  Qid ORDER BY  PostDatetime DESC) Sort FROM 对话表   
     )a,咨询表 b
     WHERE a.Qid=b.Qid AND a.Sort=1 AND DATEDIFF(HOUR,a.PostDatetime,@time)>48
     /*
     Qid         Name
    ----------- --------------------
    2           Query2(1 行受影响) */