2012-08-11 43 views
1

首先:感謝您的期待;你的時間表示讚賞!用幾列MAX()獲得整行

的一點是:

架構:爲myTable的

nonUniqueID YEAR MONTH DAY HOUR numericValue 
1    2012 01  01  01  99.9 
1    2012 01  01  02  65.2 
1    2012 01  01  03  -88 
7    2012 02  08  21  9.08 
1    2012 01  01  09  99.913 
1    2013 01  01  01  99.999999 

基本上,這兩個值nonUniqueIDnumericValue具有顆粒日期。

現在,我需要在整個數據庫中獲取單個最大日期。有了上面的數據,預期的結果是:

nonUniqueID YEAR MONTH DAY HOUR numericValue 
1    2013 01  01  01  99.999999 

因爲這是SQLite,我知道我最終不得不多次使用MAX()。順序必須是MAX(年)然後MAX(月)然後MAX(日)然後MAX(小時)。

基本上,查詢將這樣的工作(我只是不知道有足夠的瞭解SQL語法來創建查詢):

  1. 查找與最高年份
  2. 所有記錄從這組,發現所有與最高的月份
  3. 記錄從這組,找到全天最高
  4. 所有記錄從這組,找到所有記錄最高HOUR
  5. 返回該記錄

這裏是一個SQL,我改編自另一個StackExchange問​​題不起作用

Select * From ( 
    Select max(YEAR) as Y FROM myTable 

    union 

    Select max(MONTH) as M FROM myTable 

    union 

    Select max(DAY) as D FROM myTable 

    union 

    Select max(HOUR) as H FROM myTable 
) myTable; 

返回

Y 
----- 
21 
08 
02 
2013 

比較這對進出料:

nonUniqueID YEAR MONTH DAY HOUR numericValue 
1    2013 01  01  01  99.999999 

它用4個值返回了4條記錄,而不是一條記錄。

有人可以幫我解決我的問題嗎?謝謝!

回答

3

試試這個

SELECT nonUniqueID , YEAR , MONTH , DAY , HOUR , numericValue FROM myTable as a 
INNER JOIN (Select max(MONTH) FROM myTable) as b 
ON a.YEAR = B.YEAR 
INNER JOIN (Select max(DAY) FROM myTable) as c 
ON b.YEAR = c.YEAR 
INNER JOIN (Select max(HOUR) FROM myTable) as d 
ON c.YEAR = d.YEAR 
WHERE a.YEAR = (Select max(YEAR) FROM myTable) 

因爲你用UNION 這意味着結果是加入一列,它返回4個值

編輯

我剛更新了我的回答看看該作品林不太確定這個查詢的性能

+0

除了這個返回無論特定記錄的列值的其餘部分如何,每列最大值。如果我插入YEAR:2013,MONTH:01,DAY:01,HOUR:01,我將在2013年2月21日和2013年2月21日分別獲得一個月, 08 21:00在數據庫中。我已更新我的帖子以反映這一點。 – user1521764 2012-08-11 03:13:57

+0

謝謝!這讓我更接近一個工作解決方案。我已經重新評估了性能需求(數據存儲的使用遠遠少於數據檢索),並重新編寫了我的數據存儲查詢,以將粒度數據轉換爲易於排序的時間戳。我使用的API爲我提供了數據格式(EG:y = 2012,m = 08 ...),並且以這種形式存儲數據比以我的原始查詢爲代價要容易得多做檢索。我會花時間在第一次正確存儲數據。再次感謝你的幫助! – user1521764 2012-08-12 00:28:08