2011-05-06 34 views
4

我有一個包含考勤數據值的數據庫,每天多個樣本,即第一個值每月在SQL

05/01/11 01:00:00 - 1.23 
05/01/11 01:12:34 - 0.99 
.... 
05/01/11 23:59:59 - 2.34 
05/02/11 00:11:22 - 4.56 

我想獲得第一樣本名單每個月。我設法讓每一個樣本的名單在每個月的1日:

SELECT 
    "RecordTime", "FormattedValue" 
FROM 
    CDBHistoric 
WHERE 
    "Id" = 12345 AND EXTRACT (DAY FROM "RecordTime") = 1 

這給像

03/01/11 00:00:01 - 1.23 
03/01/11 00:12:34 - 0.99 
.... 
04/01/11 00:00:34 - 2.34 
04/01/11 00:11:22 - 4.56 

數據,但我一直無法獲得各組的第一個值。

+1

你使用Oracle?你只是想每天獲得第一個記錄嗎? – 2011-05-06 02:10:46

+1

什麼DBMS? SQL Server中的答案與Oracle中的答案大不相同,它與MySQL中的答案大不相同......「SQL」不足以提供答案。 – 2011-05-06 02:13:23

+0

@Ken White:代碼是標準SQL-92,所以我認爲'sql'標記就足夠了(即爲什麼不使用標準SQL-92發佈答案?) – onedaywhen 2011-05-06 07:09:17

回答

2

這是SQL Server的解決方案。這個想法是使用一個相關的子查詢來確定 每個年份和月份的最小值RecordTime。將這個想法轉化爲DBMS的風格應該很容易。

WITH Data AS (
    SELECT CONVERT(DATETIME, '1-May-2011 01:00:00') AS RecordTime, 1.23 AS FormattedValue 
    UNION ALL SELECT CONVERT(DATETIME, '1-May-2011 01:12:34'), 0.99 
    UNION ALL SELECT CONVERT(DATETIME, '1-May-2011 23:59:59'), 2.34 
    UNION ALL SELECT CONVERT(DATETIME, '2-May-2011 00:11:22'), 4.56 
) 
SELECT D1.* 
FROM Data D1 
WHERE D1.RecordTime = (SELECT MIN(RecordTime) 
         FROM Data D2 
         WHERE YEAR(D2.RecordTime) = YEAR(D1.RecordTime) 
         AND MONTH(D2.RecordTime) = MONTH(D1.RecordTime)) 

編輯:如果數據集較大,則加入了關於子查詢要快得多,但可能較難翻譯成你的DBMS的味道:

SELECT D1.* 
FROM Data D1 
INNER JOIN (
    SELECT MIN(D2.RecordTime) AS FirstMonthlyRecordTime 
    FROM Data D2 
    GROUP BY YEAR(D2.RecordTime), MONTH(D2.RecordTime) 
) AS SubQuery 
    ON D1.RecordTime = SubQuery.FirstMonthlyRecordTime 

編輯2:以下代碼是我上面第一個查詢的標準SQL-92版本(在mySQL上測試過):

SELECT T1.RecordTime, T1.FormattedValue 
FROM CDBHistoric T1 
WHERE T1.RecordTime = (SELECT MIN(T2.RecordTime) 
         FROM CDBHistoric T2 
         WHERE EXTRACT(YEAR FROM T1.RecordTime) = EXTRACT(YEAR FROM T2.RecordTime) 
         AND EXTRACT(MONTH FROM T1.RecordTime) = EXTRACT(MONTH FROM T2.RecordTime)) 
+0

OP的代碼是標準SQL-92,SQL Server不會'但支持AFAIK PostgreSQL,Oracle和mySQL。 – onedaywhen 2011-05-06 07:07:04

+0

我已經添加了我的第一個查詢的SQL-92版本。 – srgerg 2011-05-06 08:21:08

相關問題