select dt,max(sign) from a
group by month(dt)

解决方案 »

  1.   

    楼上语句是错误的。Select A.* from T1 A
    Inner Join (Select Month(dt) As dt,Max([sign]) As [sign] from T1 Group By Month(dt)) B
    On Month(A.dt)=B.dt And A.[sign]=B.[sign]
      

  2.   

    select convert(varchar(7),dt,120), max(sign) from T1 group by  convert(varchar(7),dt,120)但是这样选出的结果是
    2005-07 2
    2005-08 4无法得到详细日期
      

  3.   

    --建立测试环境
    Create Table TEST 
    (dt Varchar(10),
     sign Int)
    Insert TEST Values('2005-07-01',            1)
    Insert TEST Values('2005-07-12',            2)
    Insert TEST Values('2005-08-01',            1)
    Insert TEST Values('2005-08-11',            3)
    GO
    --测试
    Select A.* from TEST A
    Inner Join (Select Month(dt) As dt,Max([sign]) As [sign] from TEST Group By Month(dt)) B
    On Month(A.dt)=B.dt And A.[sign]=B.[sign]
    GO
    --删除测试环境
    Drop Table TEST
    GO
    --结果
    /*
    dt sign
    2005-07-12 2
    2005-08-11 3
    */
      

  4.   

    如果有跨年的数据,最好这么写--建立测试环境
    Create Table TEST 
    (dt Varchar(10),
     sign Int)
    Insert TEST Values('2005-07-01',            1)
    Insert TEST Values('2005-07-12',            2)
    Insert TEST Values('2005-08-01',            1)
    Insert TEST Values('2005-08-11',            3)
    GO
    --测试
    Select A.* from TEST A
    Inner Join (Select Left(dt,7) As dt,Max([sign]) As [sign] from TEST Group By Left(dt,7)) B
    On Left(A.dt,7)=B.dt And A.[sign]=B.[sign]
    GO
    --删除测试环境
    Drop Table TEST
    GO
    --结果
    /*
    dt sign
    2005-07-12 2
    2005-08-11 3
    */
      

  5.   

    --创建测试环境
    create table T1
    (
      dt varchar(10),
      sign int
    )
    insert T1
    select '2005-07-01',1 union
    select '2005-07-12',2 union
    select '2005-08-01',1 union
    select '2005-08-11',3--测试
    select distinct a.* from T1 a left join T1 b 
    on year(a.dt)=year(b.dt) and month(a.dt)=month(b.dt) and a.sign<b.sign
    where b.dt is null--删除测试环境
    drop table T1
    (所影响的行数为 4 行)dt         sign        
    ---------- ----------- 
    2005-07-12 2
    2005-08-11 3(所影响的行数为 2 行)
      

  6.   

    楼上的 最后一句 where b.dt is null  是什么意思  好像不加它不行
      

  7.   

    顺便问个其它问题select  convert(varchar(10),salary_mon,120) salary_mon from employee_basesalary order by salary_mon desc当表里的纪录有 300000 条的时候 执行上面那句话需要至少10秒钟有没有其它写法?
      

  8.   

    游鱼的第二种方法和lishengyu(玉)的方法都是对的.对于lishengyu的方法, 你想找出每组最小值的那条记录.
    当将两个表作按他写的关键字连接时, 每组最小值记录对应的b.dt的值
    正好是null, 所以他那样写也是对的.
    你还可以将这个表连接写成嵌套查询的形式.楼主最后提的那个问题可以试试(没试过, 觉得应该快一些):
    select  smon
    from (select distinct smon=convert(varchar(10),salary_mon,120)
          from employee_basesalary)t
    order by smon desc
      

  9.   


    select b.dt,a.sign from 
    (select month(dt)dt,max(sign) sign from t1 group by month(dt)) a,
    t1 b where datepart(mm,b.dt)=a.dt and a.sign=b.sign
      

  10.   

    ---建立测试环境
    create table table1(dt datetime,sign1 int)
    go
    insert table1 select '2005-07-01',1
    union all select '2005-07-12',2
    union all select '2005-08-01',1
    union all select '2005-08-11',3--找出同一月里 sign最大的 dtselect * from table1 where datepart(dd,dt) in (select max(datepart(dd,dt)) 
    from table1 group by datepart(mm,dt))
      

  11.   

    最后采用了游鱼的方法不过lishengyu(玉)的方法让我学了一招 呵呵最后谢谢filebat(Mark) 的详细讲解
      

  12.   

    select * from test2   // 取出结果
              where sign 
                  in             //得出每个月的最大值  
                    (select max(sign) from test2    
                                        group by substring(dt,1,7))
      

  13.   

    select convert(varchar(7),dt,120), max(sign) AS X from T1 where X in(sele * from T1) Group by convert(varchar(7),dt,120)
      

  14.   

    select convert(varchar(7),dt,120), max(sign) AS X from T1 where X in(sele * from T1) Group by convert(varchar(7),dt,120)