2014-02-06 6 views
1

안녕하세요 저는 흥미로운 문제 (정확히는 몇 가지 문제가 있음)가 있으면 누구든지 저를 도울 수 있기를 바랍니다. 저는 현재 Oracle Database에서 데이터를 가져 오는 Crystal Reports 2008에서 SQL로 작업하고 있습니다.오라클 SQL - 최대 및 최소 금액이 포함 된 최신 레코드

특정 기간에 최소 10 건 이상의 테스트를 수행 한 직원 목록을 얻어야합니다. 문제를 추가로 해결하려면 가장 최근의 10 가지 테스트 여야하며 각 고유 테스트 레퍼런스 목록이 필요합니다.

ROW NUMBER() 함수를 사용하는 시작 (첫 번째 코드 및 출력 참조)하지만 단일 직원 번호에 대한 최신 정보 10 개만 보여주고 필요한 경우 10 개의 테스트가 수행되었습니다.

나는 카운트 기능을 통합하고 적어도 10 번의 테스트를 수행 한 직원 만 보여주는 또 다른 코드 조각 (코드와 두 번째 코드 참조)을 제작했습니다.

정말 필요한 출력 표에 표시됩니다 필요가 무엇 :

그래서 내 질문/문제는 다음과 같습니다

  1. 은 더 함께 작동 할 수 있도록 내 원래의 코드를 수정하는 방법이 있나요 하나의 직원 번호보다?

  2. 두 코드를 병합하여 필요한 수의 테스트가 완료되었는지 확인하고 필요한 기준을 충족하는 직원 번호와 테스트 참조 만 표시하는지 여부 (기본 옵션)?

  3. 이 문제를 해결하고 다시 시작해야하나요?

불행히도 저는 현재 데이터베이스에 대한 관리자 액세스 권한이없는 나는 가능하면 하나의 SQL 행동 할이 필요하므로이 데이터 중 하나를 저장하기 위해 새로운 데이터 테이블을 만들 수 없습니다.

나는 이것이 도움이되는 경우 이용 가능한 데이터의 스냅 샷을 보여주는 스프레드 시트를 첨부했다.

도움을 주시면 감사하겠습니다.

WITH TESTNUMBER AS 
(SELECT TESTER.STAFF_NO, TESTER.TEST_REF, PERIOD. DATE_OF_TEST, TESTSLOT.SLOT_TIME, 
ROW NUMBER() OVER (ORDER BY TESTER.STAFF_NO DESC, PERIOD.DATE_OF_TEST DESC, 
TESTSLOT.SLOT_TIME DESC) 
AS RowNumber    
FROM dB1.TEST_EVENT TESTER  
INNER JOIN dB1.PERIOD PERIOD ON TESTER.PERIOD_ID=PERIOD.PERIOD_ID 
INNER JOIN dB1.TEST_ SLOT_TIME TESTSLOT ON TESTER.SLOT_TIME_ID=TESTSLOT.SLOT_TIME_ID) 
WHERE TESTER.STAFF_NO=405405 AND  
(PERIOD.DATE_OF_TEST>={ts '2013-08-01 00:00:00'} AND 
PERIOD.DATE_OF_TEST<={ts '2013-08-10 00:00:00'}) 

SELECT * FROM TESTNUMBER   
WHERE RowNumber BETWEEN 1 AND 10;` 

STAFF_NO TEST_REF DATE_OF_TEST SLOT_TIME  
405405 01 05/08/2013 08:40:00 
405405 02 05/08/2013 09:40:00 
405405 03 05/08/2013 10:40:00 
405405 04 06/08/2013 08:40:00 
405405 05 06/08/2013 09:40:00 
405405 06 06/08/2013 10:40:00 
405405 07 06/08/2013 11:40:00 
405405 08 07/08/2013 08:40:00 
405405 09 07/08/2013 09:40:00 
405405 10 07/08/2013 10:40:00 

쿼리 :

SELECT TESTER.STAFF_NO, count(TESTER.STAFF_NO) AS TOTALTESTS FROM 
FROM dB1.TEST_EVENT TESTER  
INNER JOIN dB1.PERIOD PERIOD ON TESTER.PERIOD_ID=PERIOD.PERIOD_ID 
INNER JOIN dB1.TEST_ SLOT_TIME TESTSLOT ON TESTER.SLOT_TIME_ID=TESTSLOT.SLOT_TIME_ID) 
WHERE (PERIOD.DATE_OF_TEST>={ts '2013-08-01 00:00:00'} AND PERIOD.DATE_OF_TEST<= 
{ts '2013-08-10 00:00:00'}) 
GROUP BY TESTER.STAFF_NO   
HAVING count(TESTER.STAFF_NO)>=10 
ORDER BY TESTER.STAFF_NO DESC` 

STAFF_NO TEST_REF   
405405 12   
366255 14  

전체 필수 출력

STAFF_NO TEST_REF DATE_OF_TEST SLOT_TIME  
405405 03 05/08/2013 10:40:00  
405405 04 06/08/2013 08:40:00 
405405 05 06/08/2013 09:40:00  
405405 06 06/08/2013 10:40:00 
405405 07 06/08/2013 11:40:00 
405405 08 07/08/2013 08:40:00 
405405 09 07/08/2013 09:40:00 
405405 10 07/08/2013 10:40:00 
405405 11 08/08/2013 08:40:00 
405405 12 08/08/2013 09:40:00 
366255 17 06/08/2013 09:40:00 
366255 18 06/08/2013 10:40:00 
366255 19 06/08/2013 11:40:00 
366255 20 06/08/2013 12:40:00 
366255 21 09/08/2013 08:40:00 
366255 22 09/08/2013 09:40:00 
366255 23 09/08/2013 10:40:00 
366255 24 09/08/2013 12:40:00 
366255 25 09/08/2013 14:40:00 
366255 26 09/08/2013 15:40:00 

이 매우 전문 보이지 않는하지만이 새로운 오전 경우 죄송합니다.

도움을 주셔서 다시 한번 감사드립니다.

답변

0

은 두 쿼리 모두 버전입니다.질문 번호

1

WITH TESTNUMBER AS 
(SELECT TESTER.STAFF_NO, TESTER.TEST_REF, PERIOD. DATE_OF_TEST, TESTSLOT.SLOT_TIME, 
ROW NUMBER() OVER (PARTITION BY TESTER.STAFF_NO ORDER BY TESTER.STAFF_NO DESC, PERIOD.DATE_OF_TEST DESC, 
TESTSLOT.SLOT_TIME DESC) 
AS RowNumber    
FROM dB1.TEST_EVENT TESTER  
INNER JOIN dB1.PERIOD PERIOD ON TESTER.PERIOD_ID=PERIOD.PERIOD_ID 
INNER JOIN dB1.TEST_ SLOT_TIME TESTSLOT ON TESTER.SLOT_TIME_ID=TESTSLOT.SLOT_TIME_ID) 
WHERE TESTER.STAFF_NO in (405405, 366255) AND  
(PERIOD.DATE_OF_TEST>={ts '2013-08-01 00:00:00'} AND 
PERIOD.DATE_OF_TEST<={ts '2013-08-10 00:00:00'}) 
SELECT * FROM TESTNUMBER   
WHERE RowNumber BETWEEN 1 AND 10 
ORDER BY STAFF_NO,RowNumber 

질문 # 2

WITH TESTNUMBER AS 
(
SELECT TESTER.STAFF_NO, TESTER.TEST_REF, PERIOD. DATE_OF_TEST, TESTSLOT.SLOT_TIME, 
ROW NUMBER() OVER (PARTITION BY TESTER.STAFF_NO ORDER BY TESTER.STAFF_NO DESC, PERIOD.DATE_OF_TEST DESC, 
TESTSLOT.SLOT_TIME DESC) 
AS RowNumber    
FROM dB1.TEST_EVENT TESTER  
INNER JOIN dB1.PERIOD PERIOD ON TESTER.PERIOD_ID=PERIOD.PERIOD_ID 
INNER JOIN dB1.TEST_ SLOT_TIME TESTSLOT ON TESTER.SLOT_TIME_ID=TESTSLOT.SLOT_TIME_ID) 
WHERE TESTER.STAFF_NO in (
          SELECT TESTER.STAFF_NO FROM 
          FROM dB1.TEST_EVENT TESTER  
          INNER JOIN dB1.PERIOD PERIOD 
           ON TESTER.PERIOD_ID = PERIOD.PERIOD_ID 
          INNER JOIN dB1.TEST_ SLOT_TIME TESTSLOT 
           ON TESTER.SLOT_TIME_ID = TESTSLOT.SLOT_TIME_ID) 
          WHERE (PERIOD.DATE_OF_TEST >= {ts '2013-08-01 00:00:00'} 
          AND PERIOD.DATE_OF_TEST <= {ts '2013-08-10 00:00:00'}) 
          GROUP BY TESTER.STAFF_NO   
          HAVING count(TESTER.STAFF_NO)>=10 
         ) 
AND (PERIOD.DATE_OF_TEST>={ts '2013-08-01 00:00:00'} 
AND PERIOD.DATE_OF_TEST<={ts '2013-08-10 00:00:00'} 
) 
SELECT * FROM TESTNUMBER   
WHERE RowNumber BETWEEN 1 AND 10 
ORDER BY STAFF_NO,RowNumber 
+0

안녕하세요 OracleUser –

+0

예 @ 데이브-69! –

+0

안녕하세요, 다시 한 번이 의견을 통해 답변을 올리려고했으며 너무 길다고 들었습니다. 대신 "답변에 대한 질문"을 대신 사용하겠습니다. –