我做一个日历表,日历表的每天 显示该天需要做的事情。只显示前2条。更多的待办事项点开日期数字后再全部显示,现在在日历表中 显示前2条。
id nday biaoti riqi
1   20  00000  2012-7-20
2   22  11111  2012-7-22
3   19  22222  2012-7-19
4   20  33333  2012-7-20
5   20  44444  2012-7-20
6   22  55555  2012-7-22
7   23  66666  2012-7-23其中 nday 是日期的天数  从riqi字段的天数获取的。现在需要 按照日期从小到大 取出每一天 的前两条记录。如果该天有3条记录只显示前2条;如果只有一条记录 只显示1条。现在我是这样做的:
SELECT id, CONVERT(varchar, DATEPART(dd, riqi)) AS nDay, biaoti,riqi
FROM xingzheng_daiban_shixiang T
WHERE (DATEPART(yy, riqi) = '2012') AND (DATEPART(mm, riqi) = '7')  
      AND  id IN (SELECT top 2 id FROM xingzheng_daiban_shixiang WHERE riqi=T.riqi) ORDER BY riqi 现在我总感觉有时候显示不对,明明数据表里面该天有记录,可就是不显示,但是有时候又显示正常。看看有没有更好的方法?

解决方案 »

  1.   

    先把最终结果查出来最后才用top 2。
      

  2.   


    declare @t table (id int identity(1,1),d date,t varchar(10));
    insert into @t select '2012-07-01','aa' union all
    select '2012-07-01','bb' union all
    select '2012-07-02','cc' union all
    select '2012-07-01','dd' union all
    select '2012-07-20','xx';select * from (
    select rn=ROW_NUMBER() over(partition by d order by id),* from @t 
    ) x where x.rn in (1,2)
    /*
    rn                   id          d          t
    -------------------- ----------- ---------- ----------
    1                    1           2012-07-01 aa
    2                    2           2012-07-01 bb
    1                    3           2012-07-02 cc
    1                    5           2012-07-20 xx
    */
    --你看是不是要这种,每一天前两条。
      

  3.   

    我需要的结果是:
    id nday biaoti riqi
    3 19 22222 2012-7-19
    1 20 00000 2012-7-20
    4 20 33333 2012-7-20
    2 22 11111 2012-7-22
    6 22 55555 2012-7-22
    7 23 66666 2012-7-23
      

  4.   

    ;with cte as(
      SELECT *
      FROM xingzheng_daiban_shixiang 
      WHERE (DATEPART(yy, riqi) = '2012') AND (DATEPART(mm, riqi) = '7')
    )SELECT id, CONVERT(varchar, DATEPART(dd, riqi)) AS nDay, biaoti,riqi
    FROM cte T
    WHERE id IN (SELECT top 2 id FROM cte WHERE riqi=T.riqi order by id) 
    ORDER BY riqi