ID 日期 值
aa01 2009/1/1 9
aa02 2009/1/1 4
aa03 2009/1/1 8
aa01 2009/1/2 5
aa02 2009/1/2 4
aa04 2009/1/2 2
aa05 2009/1/2 3
aa06 2009/1/3 1
aa07 2009/1/3 2ID和日期联合作主键。通过一个sql语句,查询ID字段(例如aa01),获得如下结果:ID 日期 值 当日排名
aa01 2009/1/1 9 3
aa01 2009/1/2 5 4当日排名,是新加的一列,指示了该ID的值在该天所有ID的值里的排名。例如,在2009/1/1,共有9、4、8三个值,aa01的排名第3。请教高手这个SQL该如何写。
谢谢!!

解决方案 »

  1.   

    SELECT
        ID,日期,值,ROW_NUMBER() OVER(PARTITION BY 日期 ORDER BY 值 DESC) AS 当日排名 
    FROM tb
    WHERE ID = 'aa01';
      

  2.   

    [code=SQL]SELECT ID ,日期,MAX( 值 )值,(SELECT COUNT(*) FROM TB WHERE ID=T.ID AND 日期=T.日期 ) AS 当日排名 FROM TB T GROUP BY ID ,日期?[/code]
      

  3.   

    当日排名=row_Number() over(partition by 日期 order by 日期)
      

  4.   

    -------------------------------------
    --  Author : liangCK 梁爱兰
    --  Comment: 小梁 爱 兰儿
    --  Date   : 2009-08-11 11:30:13
    -------------------------------------
     
    --> 生成测试数据: @T
    DECLARE @T TABLE (ID VARCHAR(4),日期 DATETIME,值 INT)
    INSERT INTO @T
    SELECT 'aa01','2009/1/1',9 UNION ALL
    SELECT 'aa02','2009/1/1',4 UNION ALL
    SELECT 'aa03','2009/1/1',8 UNION ALL
    SELECT 'aa01','2009/1/2',5 UNION ALL
    SELECT 'aa02','2009/1/2',4 UNION ALL
    SELECT 'aa04','2009/1/2',2 UNION ALL
    SELECT 'aa05','2009/1/2',3 UNION ALL
    SELECT 'aa06','2009/1/3',1 UNION ALL
    SELECT 'aa07','2009/1/3',2--SQL查询如下:SELECT
        ID,日期,值,当日排名 
    FROM (
        SELECT * ,ROW_NUMBER() OVER(PARTITION BY 日期 ORDER BY 值 ) AS 当日排名 
        FROM @T
    ) AS A
    WHERE ID = 'aa01';/*
    ID   日期                      值           当日排名
    ---- ----------------------- ----------- --------------------
    aa01 2009-01-01 00:00:00.000 9           3
    aa01 2009-01-02 00:00:00.000 5           4(2 行受影响)
    */
      

  5.   

    SELECT 
       ID ,日期,MAX( 值 )值,
       (SELECT COUNT(*)+1 FROM TB WHERE ID=T.ID AND 日期=T.日期 ) AS 当日排名 FROM TB T 
    GROUP BY 
       ID ,日期
      

  6.   

    SELECT 
       ID ,日期,MAX( 值 )值,
       (SELECT COUNT(*)+1 FROM TB WHERE ID=T.ID AND 日期=T.日期 ) AS 当日排名 FROM TB T 
    where
       ID = 'aa01';
    GROUP BY 
       ID ,日期
      

  7.   

    select *,rank=row_Number() over(partition by 日期 order by 值) from tb
      

  8.   

    DECLARE @T TABLE (ID VARCHAR(4),日期 DATETIME,值 INT)
    INSERT INTO @T
    SELECT 'aa01','2009/1/1',9 UNION ALL
    SELECT 'aa02','2009/1/1',4 UNION ALL
    SELECT 'aa03','2009/1/1',8 UNION ALL
    SELECT 'aa01','2009/1/2',5 UNION ALL
    SELECT 'aa02','2009/1/2',4 UNION ALL
    SELECT 'aa04','2009/1/2',2 UNION ALL
    SELECT 'aa05','2009/1/2',3 UNION ALL
    SELECT 'aa06','2009/1/3',1 UNION ALL
    SELECT 'aa07','2009/1/3',2select *,当日排名=(select count(*) from @t where 日期=t.日期 and 值<t.值)+1 from @T t where id='aa01'/*
    ID   日期                      值           当日排名
    ---- ----------------------- ----------- -----------
    aa01 2009-01-01 00:00:00.000 9           3
    aa01 2009-01-02 00:00:00.000 5           4(2 行受影响)
    */
      

  9.   

    ----------------------------------------------------------------
    -- Author :fredrickhu(小F 向高手学习)
    -- Date   :2009-08-11 11:34:19
    ----------------------------------------------------------------
    --> 测试数据:[tb]
    if object_id('[tb]') is not null drop table [tb]
    go
    create table [tb]([ID] varchar(4),[日期] datetime,[值] int)
    insert [tb]
    select 'aa01','2009/1/1',9 union all
    select 'aa02','2009/1/1',4 union all
    select 'aa03','2009/1/1',8 union all
    select 'aa01','2009/1/2',5 union all
    select 'aa02','2009/1/2',4 union all
    select 'aa04','2009/1/2',2 union all
    select 'aa05','2009/1/2',3 union all
    select 'aa06','2009/1/3',1 union all
    select 'aa07','2009/1/3',2
    --------------开始查询--------------------------
    SELECT 
       ID ,convert(varchar(10),日期,120),MAX( 值 )值,
       (SELECT COUNT(1)+1 FROM TB WHERE 值<t.值 AND 日期=T.日期 ) AS 当日排名 FROM TB T 
    where
       ID = 'aa01'
    GROUP BY 
       ID ,日期,值
    order by 
       convert(varchar(10),日期,120)
    ----------------结果----------------------------
    /*
    ID              值           当日排名        
    ---- ---------- ----------- ----------- 
    aa01 2009-01-01 9           3
    aa01 2009-01-02 5           4(所影响的行数为 2 行)
    */
      

  10.   

    ----------------------------------------------------------------
    -- Author :fredrickhu(小F 向高手学习)
    -- Date   :2009-08-11 11:34:19
    ----------------------------------------------------------------
    --> 测试数据:[tb]
    if object_id('[tb]') is not null drop table [tb]
    go
    create table [tb]([ID] varchar(4),[日期] datetime,[值] int)
    insert [tb]
    select 'aa01','2009/1/1',9 union all
    select 'aa02','2009/1/1',4 union all
    select 'aa03','2009/1/1',8 union all
    select 'aa01','2009/1/2',5 union all
    select 'aa02','2009/1/2',4 union all
    select 'aa04','2009/1/2',2 union all
    select 'aa05','2009/1/2',3 union all
    select 'aa06','2009/1/3',1 union all
    select 'aa07','2009/1/3',2
    --------------开始查询--------------------------
    SELECT 
       ID ,convert(varchar(10),日期,111),MAX( 值 )值,
       (SELECT COUNT(1)+1 FROM TB WHERE 值<t.值 AND 日期=T.日期 ) AS 当日排名 FROM TB T 
    where
       ID = 'aa01'
    GROUP BY 
       ID ,日期,值
    order by 
       convert(varchar(10),日期,111)
    ----------------结果----------------------------
    /*
    ID              值           当日排名        
    ---- ---------- ----------- ----------- 
    aa01 2009/01/01 9           3
    aa01 2009/01/02 5           4(所影响的行数为 2 行)
    */
      

  11.   

    ----------------------------------------------------------------
    -- Author :fredrickhu(小F 向高手学习)
    -- Date   :2009-08-11 11:34:19
    ----------------------------------------------------------------
    --> 测试数据:[tb]
    if object_id('[tb]') is not null drop table [tb]
    go
    create table [tb]([ID] varchar(4),[日期] datetime,[值] int)
    insert [tb]
    select 'aa01','2009/1/1',9 union all
    select 'aa02','2009/1/1',4 union all
    select 'aa03','2009/1/1',8 union all
    select 'aa01','2009/1/2',5 union all
    select 'aa02','2009/1/2',4 union all
    select 'aa04','2009/1/2',2 union all
    select 'aa05','2009/1/2',3 union all
    select 'aa06','2009/1/3',1 union all
    select 'aa07','2009/1/3',2
    --------------开始查询--------------------------
    SELECT 
       ID ,convert(varchar(10),日期,111) as 日期,MAX( 值 )值,
       (SELECT COUNT(1)+1 FROM TB WHERE 值<t.值 AND 日期=T.日期 ) AS 当日排名 FROM TB T 
    where
       ID = 'aa01'
    GROUP BY 
       ID ,日期,值
    order by 
       convert(varchar(10),日期,111)
    ----------------结果----------------------------
    /*
    ID   日期         值           当日排名        
    ---- ---------- ----------- ----------- 
    aa01 2009/01/01 9           3
    aa01 2009/01/02 5           4(所影响的行数为 2 行)*/
      

  12.   

    [code=SQL]if object_id('t') is not null
    drop table t
    go
    create table t(id varchar(10), 日期 datetime , 值 int)
    goinsert into t select 'aa01','2009/1/1', 9 
    union all select  'aa02', '2009/1/1',  4 
    union all select  'aa03', '2009/1/1',  8 
    union all select  'aa01', '2009/1/2',  5 
    union all select  'aa02', '2009/1/2',  4 
    union all select  'aa04', '2009/1/2',  2 
    union all select  'aa05', '2009/1/2',  3 
    union all select  'aa06', '2009/1/3',  1 
    union all select  'aa07', '2009/1/3',  2 
    --2000
    select * from
    (select * ,当日排名=(select count(1) from t where 日期=m.日期 and 值<=m.值)  from t as m) as a
    where id='aa01'
    --2005
    select * from
    (select * ,当日排名=row_number() over(partition by 日期 order by 值  ) from t) as a
    where id='aa01'
    /*id         日期                      值           当日排名
    ---------- ----------------------- ----------- -----------
    aa01       2009-01-01 00:00:00.000 9           3
    aa01       2009-01-02 00:00:00.000 5           4(2 行受影响)*/[/code]
      

  13.   

    create TABLE #TT (ID VARCHAR(4),日期 DATETIME,值 INT)
    INSERT INTO #TT
    SELECT 'aa01','2009/1/1',9 UNION ALL
    SELECT 'aa02','2009/1/1',4 UNION ALL
    SELECT 'aa03','2009/1/1',8 UNION ALL
    SELECT 'aa01','2009/1/2',5 UNION ALL
    SELECT 'aa02','2009/1/2',4 UNION ALL
    SELECT 'aa04','2009/1/2',2 UNION ALL
    SELECT 'aa05','2009/1/2',3 UNION ALL
    SELECT 'aa06','2009/1/3',1 UNION ALL
    SELECT 'aa07','2009/1/3',2select *,
    (select count(*)+1 from #TT where 值<T.值 and 日期=T.日期) as 排名
    from #TT T where ID='aa01'
    ID   日期                      值           排名
    ---- ----------------------- ----------- -----------
    aa01 2009-01-01 00:00:00.000 9           3
    aa01 2009-01-02 00:00:00.000 5           4(2 行受影响)
      

  14.   

    if object_id('t') is not null
    drop table t
    go
    create table t(id varchar(10), 日期 datetime , 值 int)
    goinsert into t select 'aa01','2009/1/1', 9 
    union all select  'aa02', '2009/1/1',  4 
    union all select  'aa03', '2009/1/1',  8 
    union all select  'aa01', '2009/1/2',  5 
    union all select  'aa02', '2009/1/2',  4 
    union all select  'aa04', '2009/1/2',  2 
    union all select  'aa05', '2009/1/2',  3 
    union all select  'aa06', '2009/1/3',  1 
    union all select  'aa07', '2009/1/3',  2 
    --2000
    select * from
    (select * ,当日排名=(select count(1) from t where 日期=m.日期 and 值<=m.值)  from t as m) as a
    where id='aa01'
    --2005
    select * from
    (select * ,当日排名=row_number() over(partition by 日期 order by 值  ) from t) as a
    where id='aa01'/*id        日期                      值          当日排名 
    ---------- ----------------------- ----------- ----------- 
    aa01      2009-01-01 00:00:00.000 9          3 
    aa01      2009-01-02 00:00:00.000 5          4 (2 行受影响)*/