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

SQL从子查询中的字段中选择最小值以返回1条记录,sql,oracle,group-by,subquery,greatest-n-per-group,Sql,Oracle,Group By,Subquery,Greatest N Per Group,如何从子查询中选择一条记录,并在ORDER_NO字段中使用最小值 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, SECTIO

如何从子查询中选择一条记录,并在ORDER_NO字段中使用最小值

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 |
似乎您希望从这个查询中得到一行,其中ORDER\u NO是集合的最小ORDER\u NO

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

ORDER BY ORDER_NO;

Top 1将只获得一行,通过按订单号订购,您可以确保您的单行退货集是包含最小订单号的退货集,这似乎有效……除非有人有更好的想法

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;

请在你的问题中加上这个。不可能在评论中读到。当前的问题是什么?您是否只需要当前结果中的一条记录?或者您得到的结果是错误的?我不知道如何在这个问题上添加子查询结果,当我将其粘贴到表上时,表是一团乱。是的,结果中只有一条记录。我想我没有指定…Oracle SQLPlus我是新来的…抱歉!