2014-05-06 153 views
-2

试图让这个输出:最小值和最大值--Oracle

试图让这个输出Oracle 8i中:从另一个查询

column1 |starttime |endtime  | ID 
    ________|___________|___________ | 
     ABC | 00:00:01 | 01:00:01 | 1 
     ABC | 00:00:02 | 01:00:02 | 1 
     ABC | 00:00:03 | 01:00:03 | 1 
     123 | 00:00:04 | 01:00:04 | 2 
     123 | 00:00:05 | 01:00:05 | 2 
     123 | 00:00:06 | 01:00:06 | 2 
     123 | 00:00:07 | 01:00:07 | 2 
     ABC | 00:00:08 | 01:00:08 | 3 
     ABC | 00:00:09 | 01:00:09 | 3 
     ABC | 00:00:10 | 01:00:10 | 4 

column1 |time 
________|_______ 
    ABC | 00:00:01 
    END | 01:00:03 
    123 | 00:00:04 
    END | 01:00:07 
    ABC | 00:00:08 
    END | 01:00:09 
    ABC | 00:00:10 
    END | 01:00:10 

这个输出查询获取仅启动时间列的最小值和最大值:

SELECT (
    CASE 
    WHEN n.n = 1 
    THEN column1 
    ELSE 'END' 
    END) AS column1, 
    (
    CASE 
    WHEN n.n = 1 
    THEN firsttime 
    ELSE lasttime 
    END) AS "time" 
FROM 
    (SELECT column1, 
    id, 
    MIN(starttime) AS firsttime, 
    MAX(starttime) AS lasttime 
    FROM t 
    GROUP BY column1, 
    id 
) t 
CROSS JOIN 
    (SELECT 1 AS n FROM dual 
    UNION ALL 
    SELECT 2 FROM dual 
) n 
ORDER BY id, 
    column1, 
    n.n; 

现在我又有了一个名为endtime的专栏,我不知道该怎么考虑这个专栏,并从该专栏中获取END值?由于n.n1,所以我只能在ID中只记录一条记录。

+0

考虑结束时间总是大于开始时间..'MAX(结束时间)'本身还不够吗? –

+0

@downvoter:我知道为什么吗? –

+0

@OracleUser:问题是当我每个ID只有一行时。无论如何,在这种情况下,n.n将是1。 –

回答

0

刚刚尝试使用下面的查询,

with DUMMYDATA AS 
( 
SELECT 'ABC' COL1, '00:00:01' STARTTIME, '01:00:01' ENDTIME, '1' ID FROM DUAL 
UNION 
SELECT 'ABC' COL1, '00:00:02' STARTTIME, '01:00:02' ENDTIME, '1' ID FROM DUAL 
UNION 
SELECT 'ABC' COL1, '00:00:03' STARTTIME, '01:00:03' ENDTIME, '1' ID FROM DUAL 
UNION 
SELECT '123' COL1, '00:00:04' STARTTIME, '01:00:04' ENDTIME, '2' ID FROM DUAL 
UNION 
SELECT '123' COL1, '00:00:05' STARTTIME, '01:00:05' ENDTIME, '2' ID FROM DUAL 
UNION 
SELECT '123' COL1, '00:00:06' STARTTIME, '01:00:06' ENDTIME, '2' ID FROM DUAL 
UNION 
SELECT '123' COL1, '00:00:07' STARTTIME, '01:00:07' ENDTIME, '2' ID FROM DUAL 
UNION 
SELECT 'ABC' COL1, '00:00:08' STARTTIME, '01:00:08' ENDTIME, '3' ID FROM DUAL 
UNION 
SELECT 'ABC' COL1, '00:00:09' STARTTIME, '01:00:09' ENDTIME, '3' ID FROM DUAL 
UNION 
SELECT 'ABC' COL1, '00:00:10' STARTTIME, '01:00:10' ENDTIME, '4' ID FROM DUAL 
) 
SELECT * FROM 
(
    SELECT COL1, MIN(STARTTIME) TIMEDATA, ID FROM DUMMYDATA 
    GROUP BY COL1, ID 
    UNION ALL 
    SELECT 'END', MAX(ENDTIME) TIMEDATA,ID FROM DUMMYDATA 
    GROUP BY COL1, ID 
) 
ORDER BY ID, TIMEDATA 
相关问题