日期:2014-05-17  浏览次数:20897 次

分组、指定日期、求最大值,多个条件加一起就晕了啊
表的内容如下,现在想知道在某个日期时候前,所有技能最高等级的统计汇总情况,比如在2009-06-01日时候的结果是A-1,C-2,D-1,在2010-12-31日的时候是A-1,B-2,C-1,D-1
----------------------------------------------------
ID 姓名 等级日期 技能等级
1 张三 2005-11-11 D
2 张三 2006-04-19 C
3 张三 2009-11-25 B
4 李四 2005-01-05 D
5 李四 2007-12-09 C
6 李四 2009-10-11 B
7 李四 2011-03-13 A
8 王五 2010-09-02 D
9 赵六 2007-08-01 D
10 赵六 2009-11-07 C
11 钱七 2003-03-04 D
12 钱七 2005-09-12 C
13 钱七 2007-11-18 B
14 钱七 2009-05-29 A

------解决方案--------------------
-- 日期要求连续不?
------解决方案--------------------
select a.等级日期,b.技能等级,count(b.姓名) as cnt
(select 等级日期 from 表A group by 等级日期) a, 表A b
where b.等级日期<a.等级日期
group by a.等级日期,b.技能等级
------解决方案--------------------
数据是A,B,C,D没懂后面的 A-1,B-2是怎么来的?
------解决方案--------------------
探讨

意思就是统计的结果是A的1个,B的2个,

------解决方案--------------------
SQL code
SQL> select * from t1;

        ID NAME LEVEL_DATE          SKILL_LEVEL
---------- ---- ------------------- -----------
         1 张三 2005-11-11 00:00:00 D
         2 张三 2006-04-19 00:00:00 C
         3 张三 2009-11-25 00:00:00 B
         4 李四 2005-01-05 00:00:00 D
         5 李四 2007-12-09 00:00:00 C
         6 李四 2009-10-11 00:00:00 B
         7 李四 2011-03-13 00:00:00 A
         8 王五 2010-09-02 00:00:00 D
         9 赵六 2007-08-01 00:00:00 D
        10 赵六 2009-11-07 00:00:00 C
        11 钱七 2003-03-04 00:00:00 D
        12 钱七 2005-09-12 00:00:00 C
        13 钱七 2007-11-18 00:00:00 B
        14 钱七 2009-05-29 00:00:00 A

已选择14行。

SQL> WITH t AS
  2   (SELECT *
  3      FROM t1
  4     WHERE t1.level_date < to_date('2010-12-31', 'yyyy-mm-dd hh24:mi:ss'))
  5  SELECT skill_level || '-' || COUNT(*) SKILL_LEVEL
  6    FROM t
  7   WHERE NOT EXISTS (SELECT 1
  8            FROM t b
  9           WHERE b.name = t.name
 10             AND b.skill_level < t.skill_level)
 11   GROUP BY skill_level;

SKILL_LEVEL
-----------
D-1
B-2
C-1
A-1

SQL>