2014-10-30 60 views
2

所以我有一個問題SQlite。我有一個表結果取回每個ID的第二個最新日期而不是最新的

我想現在寫一個查詢,讓我回來不是最新的,但之後的行。讓我們在一個例子看看:

ID,searchID,hit,time 
1,1,3,1-1-2008 
1,1,8,1-1-2009 
1,1,4,1-1-2010 
1,2,9,1-1-2011 
1,2,10,1-1-2009 

,我想現在,讓每searchID回來一次(預最新):

1,1,8,1-1-2009 
1,2,10,1-1-2009 

這是很容易與上次做時間

SELECT searchID, hit, max(time) 
FROM results 
group BY searchID 

但我需要預先的最新由於某些原因。

PS:這一個我發現What is the simplest SQL Query to find the second largest value?,但無法申請我的情況。

+0

定義'最新'。並注意SQL中的日期和時間通常遵循特定的格式 – Strawberry 2014-10-30 20:27:28

+0

哇,大家,問題是,我有時間在即將到來的星期一測試它。但提前謝謝你。你的想法看起來很不錯=) – kwoxer 2014-10-31 08:23:18

回答

1

使用除1/1以外的任何其他日期/月份都會弄糟日期字符串比較;您應該使用日期格式,如yyyy-mm-dd

假設你有工作日期進行比較,您可以用compound query刪除所有的最大行數,然後組在休息:

SELECT searchID, hit, MAX(time) 
FROM (SELECT searchID, hit, time 
     FROM results 
     EXCEPT 
     SELECT searchID, hit, MAX(time) 
     FROM results 
     GROUP BY searchID) 
GROUP BY searchID 

,或者你可以檢查,分組之前,該時間是不是組中最大的時間:

SELECT searchID, hit, MAX(time) 
FROM results 
WHERE time < (SELECT MAX(time) 
       FROM results AS r2 
       WHERE r2.searchID = results.searchID) 
GROUP BY searchID 
+0

'hit'將是隨機的 – Strawberry 2014-10-31 08:41:58

+0

@Strawberry不,SQLite [ensure](http://www.sqlite.org/releaselog/3_7_11.html)未聚集的列來自同一行匹配MAX()。 – 2014-10-31 10:28:29

+0

糟糕 - 沒有看到關係型數據庫 - 我沒有;不知道! sqlfiddle(sql.js)可能會有用。 – Strawberry 2014-10-31 11:03:12