2012-09-04 79 views
-3

您有三個ID字段,日期和總計字段。您的表格在同一天包含多行,這是有效的數據,但爲了報告目的,您需要每天只顯示一行。應該返回每天ID最高的行,其餘的應該從用戶隱藏(不返回)。 爲了更好的畫面下面的問題是採樣數據和輸出樣本:ID最高的行

ID, Date, Total 
1, 2011-12-22, 50 
2, 2011-12-22, 150 

正確的結果是:

2, 2012-12-22, 150 

正確的輸出是單獨的行,2011-12-22的日期和該行是選擇,因爲它具有最高的ID(2> 1)

+7

SQL是什麼? (例如MySQL,SQL Server等) – hims056

+2

我假設還有其他*行的日子(你的例子不是太瑣碎,我覺得,如果是這樣的話)。另外,你使用的是什麼RDBMS? –

+0

'SELECT * FROM TABLE ORDER BY ID DESC LIMIT 1' or'SELECT MAX(ID)FROM TABLE' – nuthan

回答

1

假設你有一個支持窗口功能的數據庫,並且該date列確實只是date(而不是datetime),然後是這樣的:

SELECT 
    * --TODO - Pick columns 
FROM 
    (
     SELECT ID,[Date],Total,ROW_NUMBER() OVER (PARTITION BY [Date] ORDER BY ID desc) rn 
     FROM [Table] 
    ) t 
WHERE 
    rn = 1 

應該每天產生一行 - 並且任何給定日期的選定行都是具有最高ID值的行。

0
Select MAX(ID),Data,Total from foo 

爲MySQL

+0

誰將地獄投票而不給出理由? – Stefan

+3

我沒有downvote,但是你的解決方案在大多數SQL實現中都不起作用(因爲'Data'和'Total'不包含在聚合或GROUP BY子句中)。不幸的是,儘管有一些要求,OP從未澄清他們使用的數據庫系統。我相信你的答案*可能*在MySQL上工作 - 所以值得將這個答案作爲一個明確的假設加以補充。另外,通過點擊「{}」按鈕來格式化代碼。最後,這是SO設置的一部分,不幸的是,downvoters不能*給出一個理由。 –

+0

我不知道有沒有義務給出一個理由 - 儘管我認爲總是尊重(並且有幫助)給出一個簡短的理由,爲什麼要低估一個答案。這是一個可以幫助和討論的地方 - 如果你有時間冷靜下來,花些時間來解釋你不喜歡的東西。 – Stefan

0

也許

SELECT * FROM your_table ORDER BY ID DESC LIMIT 1 
+0

+1因爲你的工作會很好,因爲我不知道誰在這裏投票.. – Stefan

1
SELECT * 
FROM table 
WHERE ID IN (SELECT MAX(ID) 
       FROM table 
       GROUP BY Date) 
+0

會不會查詢數據庫2次?猜測這會花費比給出單個查詢指令更長的時間,儘管它應該以這種方式工作。 – Stefan

+1

@Stefan我假設數據庫中有比OP提供的2個樣本更多的行。我還假設該表包含多天的數據,並且查詢應該每天返回一行。 –

+0

謝謝你的解釋。 – Stefan

1

這將工作。

SELECT * 
FROM tableName a 
      INNER JOIN 
      (
       SELECT `DATE`, MAX(ID) maxID 
       FROM tableName 
       GROUP BY `DATE` 
      ) b ON a.id = b.MaxID AND 
       a.`date` = b.`date` 

SQLFiddle Demo

0

另一種簡單的方法是

SELECT TOP 1 * FROM YourTable ORDER BY ID DESC 

而且,我覺得這是最簡單的辦法!

0
SELECT * FROM TABLE_SUM S WHERE S.ID = 
( 
SELECT MAX(ID) FROM TABLE_SUM 
WHERE CDATE = GG.CDATE 
GROUP BY CDATE 
)