2014-09-03 42 views
0

如何從OR子項中用MIN值查詢子查詢中的一條記錄?SQL從子查詢中的字段中選擇MIN值以返回1條記錄

SELECT STATE_CODE, 
    PROJECT_ID, 
    MIN(ORDER_NO) AS ORDER_NO, 
    TEST_SECTION 
FROM 
    (SELECT STATE_CODE, 
    PROJECT_ID, 
    ORDER_NO, 
    RECORD_STATUS, 
    TEST_SECTION, 
    SECTION_START, 
    SECTION_END, 
    SECTION_CUT_FILL, 
    DIRECTION_OF_TRAVEL, 
    CASE 
     WHEN DIRECTION_OF_TRAVEL=LEAD(DIRECTION_OF_TRAVEL) OVER (ORDER BY STATE_CODE,PROJECT_ID,ORDER_NO) 
     OR DIRECTION_OF_TRAVEL =LAG(DIRECTION_OF_TRAVEL) OVER (ORDER BY STATE_CODE,PROJECT_ID,ORDER_NO) 
     THEN 'MAIN DIRECTION' 
     ELSE 'OPPOSITE DIRECTION' 
    END AS "DIRECTION" 
    FROM SPS_PROJECT_STATIONS 
    WHERE STATE_CODE=24 
    AND PROJECT_ID LIKE 'A3%%' 
    AND SUBSTR(TEST_SECTION,3,2)=SUBSTR(PROJECT_ID,1,2) 
) 
GROUP BY STATE_CODE, 
    PROJECT_ID; 

下面是子查詢的結果:

 
| STATE_CODE | PROJECT_ID | ORDER_NO | RECORD_STATUS | TEST_SECTION | SECTION_START | SECTION_END | SECTION_CUT_FILL | DIRECTION_OF_TRAVEL | DIRECTION  | 
|:----------:|------------|----------|---------------|--------------|---------------|-------------|------------------|---------------------|----------------| 
| 24   | A300  | 2  | E    | 24A310  | 320   | 472   | 3    | 1     | MAIN DIRECTION | 
| 24   | A300  | 3  | E    | 24A330  | 533   | 686   | 3    | 1     | MAIN DIRECTION | 
| 24   | A300  | 4  | E    | 24A320  | 747   | 899   | 2    | 1     | MAIN DIRECTION | 
| 24   | A300  | 5  | E    | 24A340  | 960   | 1113  | 3    | 1     | MAIN DIRECTION | 
| 24   | A300  | 6  | E    | 24A350  | 1173   | 1325  | 1    | 1     | MAIN DIRECTION | 
| 24   | A300  | 7  | E    | 24A311  | 1386   | 1539  | 2    | 1     | MAIN DIRECTION | 
| 24   | A300  | 8  | E    | 24A331  | 1584   | 1736  | 1    | 1     | MAIN DIRECTION | 
+1

請將此添加到您的問題。在評論中閱讀它是不可能的。 – 2014-09-03 17:54:00

+0

目前的問題是什麼?你只需要從當前結果中記錄一條記錄?還是你得到錯誤的結果? – Vulcronos 2014-09-03 17:59:09

+0

我不確定如何在問題上添加子查詢結果,當我將它粘貼在該表上時,表格很亂。 – TheLos 2014-09-03 18:02:19

回答

0

看來,你想從這個查詢,其中ORDER_NO是你集的MIN ORDER_NO一行。

SELECT TOP 1 STATE_CODE, 
    PROJECT_ID, 
    ORDER_NO, 
    TEST_SECTION 
FROM (...) 

ORDER BY ORDER_NO; 

頂部1將得到只有一行,並通過ORDER_NO訂購您可以確保您的單行返回集合包含MIN ORDER_NO

+0

我想我沒有指定... Oracle SQLPlus 我對此很陌生......對不起! – TheLos 2014-09-03 18:19:13

0

這似乎是工作......除非有人有一個更好的主意

SELECT * 
FROM 
(SELECT STATE_CODE, 
PROJECT_ID, 
ORDER_NO, 
RECORD_STATUS, 
TEST_SECTION, 
SECTION_START, 
SECTION_END, 
SECTION_CUT_FILL, 
DIRECTION_OF_TRAVEL, 
DIRECTION, 
ROW_NUMBER() OVER (PARTITION BY STATE_CODE,PROJECT_ID ORDER BY STATE_CODE,PROJECT_ID,ORDER_NO) AS "ROW NUMBER" 
FROM 
(SELECT STATE_CODE, 
    PROJECT_ID, 
    ORDER_NO, 
    RECORD_STATUS, 
    TEST_SECTION, 
    SECTION_START, 
    SECTION_END, 
    SECTION_CUT_FILL, 
    DIRECTION_OF_TRAVEL, 
    CASE 
    WHEN DIRECTION_OF_TRAVEL=LEAD(DIRECTION_OF_TRAVEL) OVER (ORDER BY STATE_CODE,PROJECT_ID,ORDER_NO) 
    OR DIRECTION_OF_TRAVEL =LAG(DIRECTION_OF_TRAVEL) OVER (ORDER BY STATE_CODE,PROJECT_ID,ORDER_NO) 
    THEN 'MAIN DIRECTION' 
    ELSE 'OPPOSITE DIRECTION' 
    END AS "DIRECTION" 
FROM SPS_PROJECT_STATIONS 
WHERE STATE_CODE=24 
AND PROJECT_ID LIKE 'A3%%' 
AND SUBSTR(TEST_SECTION,3,2)=SUBSTR(PROJECT_ID,1,2) 
ORDER BY STATE_CODE, 
    PROJECT_ID, 
    ORDER_NO 
) 
WHERE DIRECTION='MAIN DIRECTION' 
) 
WHERE "ROW NUMBER"=1;