SQL从子查询中的字段中选择MIN值以返回1条记录

时间:2014-09-03 17:46:48

标签: sql oracle group-by subquery greatest-n-per-group

如何从ORDER_NO字段中的MIN值中选择子查询中的一条记录?

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 |

2 个答案:

答案 0 :(得分:0)

您似乎需要此查询中的一行,其中ORDER_NO是您的集合的MIN ORDER_NO。

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

ORDER BY ORDER_NO;

Top 1只会获得一行,并且通过ORDER_NO排序,您确保您的单行返回集是包含MIN ORDER_NO

的行。

答案 1 :(得分: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;