2013-04-03 75 views
1

假設我有以下Oracle表,我想the last (aka max) entry by aGroup and day where the timepart of dateTime in less than 00:00:15(每日應提取爲dateTime日期部分)如何獲得一天從一個DateTime

什麼是它的SQL查詢(我不知道如何從dateTime中提取日期)?

   dateTime aGroup 
2011-01-01 00:00:12  a 
2011-01-01 00:00:31  a 
2012-01-01 00:00:09  a 
2012-01-01 00:00:03  a 
2011-01-01 00:00:06  b 
2011-01-01 00:00:14  b 
2011-01-01 00:00:16  b 
2012-01-01 00:00:16  b 
2012-01-01 00:00:11  b 

這是想要我希望結果

   dateTime aGroup 
2011-01-01 00:00:12  a 
2012-01-01 00:00:09  a 
2011-01-01 00:00:14  b 
2012-01-01 00:00:11  b 
+1

它是由aGroup AND日 – statquant

+0

_「我不知道如何從dateTime提取日期」_ - http://www.google.com/search?q=oracle+sql+date+functions – CBroe

回答

1

這是使用TO_CHAR

SELECT AGROUP, MAX(DATETIME) FROM MYTABLE 
WHERE TO_CHAR(DATETIME,'SS') <'15' 
GROUP BY TO_CHAR(DATETIME,'YYYY-MM-DD'), AGROUP 
ORDER BY AGROUP 
+0

謝謝,它適用於這個例子,但假設我有20列,我希望結果與所有列,當我做'選擇MYTABLE。*,MAX(DATETIME)從MYTABLE ...'它不再工作。 .. – statquant

+0

如果你有20列(組),你不能在group by中使用*語法,你必須單獨將所有這些添加到SELECT和GROUP BY子句中 –

+0

真的嗎?這個規則沒有解決方法嗎?一旦我有ORDER BY子句,我需要自己編寫所有列? – statquant

1

考慮類似這樣的查詢:

SELECT 
    MAX(DateTime), 
    aGroup 
FROM 
    tablename 
WHERE 
    TIME_TO_SEC(TIME(DateTime)) < 15 
GROUP BY 
    DATE(DateTime), 
    aGroup 

這會給你最大的時間(小於00:00 :15)每個aGroup的每一天。

編輯:更新使用TIME_TO_SEC爲Oracle

+0

這不適用於Oracle。 –

1

TRUNC function是非常方便的提取天:

SELECT dateTime, aGroup 
FROM 
(
    SELECT dateTime 
      , aGroup 
      , RANK() OVER (PARTITION BY aGroup, TRUNC(dateTime, 'DDD') ORDER BY dateTime DESC) as Rank 
    FROM table 
    WHERE (dateTime - TRUNC(dateTime, 'DDD')) * 24 * 3600 < 15 
) 
WHERE Rank = 1 

WHERE (dateTime - TRUNC(dateTime, 'DDD')) * 24 * 3600 < 15 

計算差異天之間的當前日期和一天的開始。
乘以24和3600有多少秒,和過濾如果低於15

1
select dateTime, agroup 
    from (select dateTime, agroup, 
       row_number() over (partition by agroup, trunc(datetime) 
            order by datetime desc) rn 
      from yourtab 
     where to_number(to_char(datetime, 'hh24miss')) < 15) 
where rn = 1 

會做我的嘗試。請參閱http://sqlfiddle.com/#!4/b4eb98/1

+0

感謝您告訴我有關SQL的新功能sqlfiddle,而且我非常驚訝「一旦您放入GROUP BY子句,您必須自己編寫任何字段」......但這是它的原因 – statquant

+0

此外,此解決方案非常與其他人相比,速度慢嗎? – statquant

相關問題