【问题标题】:Oracle SQL - Most Recent List of Records with a Max and Min AmountOracle SQL - 具有最大和最小数量的最新记录列表
【发布时间】:2014-02-25 16:20:01
【问题描述】:

你好我有一个我希望是一个有趣的问题(准确地说是几个问题),我希望有人可以帮助我。我目前在 Crystal Reports 2008 中使用 SQL,它从 Oracle 数据库中获取数据。

我需要获取在给定时间段内完成了特定最少测试次数(例如超过 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

对不起,如果这看起来不是很专业,但我是新手。

再次感谢您的帮助。

【问题讨论】:

    标签: sql oracle crystal-reports-2008


    【解决方案1】:

    这只是您的两个查询的合并版本。

    对于问题 #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
    

    【讨论】:

    • 再次您好,我尝试通过此评论发表我的回复,但被告知太长,因此我将使用“回答您的问题”。
    猜你喜欢
    • 2022-01-23
    • 1970-01-01
    • 2021-01-03
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    • 1970-01-01
    相关资源
    最近更新 更多