表A 排序   类别      时间         字段。。
5       k         20100101      a...
8       k         20100102      b...
0       y         20100101      c...
15      y         20100103      j...
15      M         20100102      d...
34      M         20100102      e...
70      M         20100103      f...
72      M         20100103      g...问题 给定参数 时间 
求:所有该时间的所在类别的记录(*这个时间必须是该类别中的排序值为最小的时生效,这个排序在同类别内唯一)
比如:参数时间=20100101 时
要得到的结果为:
5       k       20100101      a...
8       k       20100102      b...
0       y       20100101      c...
当参数时间=20100102 时
15      M       20100102      d...
34      M       20100102      e...
70      M       20100103      f...
72      M       20100103      g...
因为第2条记录在类别K中的排序不是最小所以整个类别被过滤掉,
而M类别中20100102中包含了排序最小的就是15所以整个m类别被查出当参数时间=20100103 时 0 条记录我这样写的可是后面怎样加条件也过滤不掉 参数时间在所在排序中不是最小值时的记录,怎么写啊
select * from a where 类别 in (select 类别 from a 时间=20100101) and ....

解决方案 »

  1.   

    select * from a
    where 类别 in (
    select 类别
    from a a1
    where 时间 = @时间     --- 参数
    and not exists ( 
     select 1
     from a
     where 排序<a1.排序
     and 类别=a1.类别
     )
    )
      

  2.   

    参数时间=20100101 时
    要得到的结果为:
    5 k 20100101 a...
    8 k 20100102 b...
    0 y 20100101 c...
    这个不对,应该参数时间=20100101 时
    要得到的结果为:
    5 k 20100101 a...
    8 k 20100102 b...
    0 y 20100101 c...
    15 y 20100103 j...
      

  3.   

    select * from a
    where 类别 in (  select b.类别 from 
     ( select 类别,时间,rank() over(partion by 类别 Order by 时间 esc) rk
       from a) b
      where b.rk = 1 and b.时间 =@时间

    oracle
      

  4.   

    DECLARE @a TABLE(a INT,b VARCHAR(20),c VARCHAR(10),d VARCHAR(20))
    insert @a select 5 ,'k', '20100101', 'a...'
    union all select 8 ,'k', '20100101', 'b...'
    union all select 0 ,'y', '20100101', 'c...'
    union all select 15 ,'y', '20100103', 'j...'
    union all select 15 ,'M', '20100102', 'd...'
    union all select 34 ,'M', '20100102', 'e...'
    union all select 70 ,'M', '20100103', 'f...'
    union all select 72 ,'M', '20100103', 'g...'
    DECLARE @s VARCHAR(200)
    SET @s='20100101'SELECT * FROM @a WHERE b IN (SELECT b FROM @a a WHERE c=@s and not EXISTS(SELECT 1 FROM @a where b=a.b AND c<a.c))
    --or
    SELECT * FROM @a WHERE b=ANY(SELECT b FROM @a a WHERE c=@s and @s=(SELECT min(c) FROM @a WHERE b=a.b))