Имя столбца становится недействительным после ссылки как результат агрегатной функции MIN () - PullRequest
0 голосов
/ 23 мая 2018
SELECT cust_detl.*, 
       MIN(CREATION_TIMESTAMP) OVER (PARTITION BY CUST_ID) AS MIN_TIMESTAMP
FROM CUST_DETAILS cust_detl
WHERE CREATION_TIMESTAMP=MIN_TIMESTAMP;

Выше запроса выберите все столбцы из таблицы CUST_DETAILS с самым старым значением в столбце CREATION_TIMESTAMP.

Есть идеи, почему MIN_TIMESTAMP встречается как неверный идентификатор?

Это столбцы, которые должны отображаться:

SELECT
  CUSTOMER_DTL_SEQ.nextval,
  CUST_ID
  CUS_REF_ID
  CUST_NAME
  CUST_ADDRESS
  CREATION_TIMESTAMP
FROM
(
  CUSTOMER_DTL_SEQ.nextval,
   cust_detl.CUST_ID,
   cust_detl.CUST_REF_ID,
   cust_detl.CUST_NAME,
   cust_detl.CUST_ADDRESS,
   cust_detl.CREATION_TIMESTAMP,
    MIN(CREATION_TIMESTAMP) OVER (PARTITION BY CUST_ID) AS min_timestamp
    FROM cust_details cust_detl
  )
 WHERE CREATION_TIMESTAMP = min_timestamp;

Мне нужно выбрать столбец CREATION_TIMESTAMPкроме того, будут выбраны только те столбцы с минимальной отметкой времени.Проблема в том, что последовательность с nextval не разрешена.Мне понадобится последовательность в запросе, так как эта оценка будет использоваться для INSERT позже SELECT...INSERT INTO

PK должен быть увеличен.

1 Ответ

0 голосов
/ 23 мая 2018

Имя столбца еще не является действительным, данные сначала фильтруются с условием where, а затем по отфильтрованным данным работает оператор select.Вы должны поместить его в подзапрос, прежде чем сможете его использовать.

SELECT * FROM
(SELECT cust_detl.*, 
        MIN(CREATION_TIMESTAMP) OVER (PARTITION BY CUST_ID) AS MIN_TIMESTAMP
   FROM CUST_DETAILS cust_detl)
WHERE CREATION_TIMESTAMP=MIN_TIMESTAMP;

ОБНОВЛЕНИЕ: Я не знаю, какой список столбцов у вас есть в таблице, но если вам нужнотолько определенные столбцы, тогда запрос будет выглядеть следующим образом (при условии, что в списке выбора вам нужны только столбцы cust_id, column1, column2 и column3)

SELECT cust_id,
       column1,
       column2,
       column3
  FROM (SELECT cust_detl.cust_id,
               cust_detl.column1,
               cust_detl.column2,
               cust_detl.column3,
               cust_detl.creation_timestamp,
               MIN(creation_timestamp) over(PARTITION BY cust_id) AS min_timestamp
          FROM cust_details cust_detl)
 WHERE creation_timestamp = min_timestamp;

Если решение все еще не получено, опубликуйте списокстолбцов из таблицы и ожидаемый результат.

Update2 : выборка курсора во внешнем запросе, этот запрос должен работать нормально.

SELECT customer_dtl_seq.nextval,
       cust_id,
       cus_ref_id, 
       cust_name,
       cust_address,
       creation_timestamp
  FROM (SELECT cust_detl.cust_id,
               cust_detl.cust_ref_id,
               cust_detl.cust_name,
               cust_detl.cust_address,
               cust_detl.creation_timestamp,
               MIN(creation_timestamp) over(PARTITION BY cust_id) AS min_timestamp
          FROM cust_details cust_detl)
 WHERE creation_timestamp = min_timestamp;
...