2011-08-07 173 views
5

我有loanTable含有兩個領域loan_idstatus獲取最後一條記錄在SQL中的WHERE條件

loan_id status 
============== 
1  0 
2  9 
1  6 
5  3 
4  5 
1  4 <-- How do I select this?? 
4  6 

在這種情況下,我需要顯示最後的loan_id 1即Statusstatus 4.可以幫我在這個查詢中。

+3

如果沒有「序列」列或日期或東西,你永遠無法找到以一致的方式「最後」的地位。根據你的表索引的方式,如果你的查詢計劃將使用多個CPU等等,你將得到不一致的結果。 –

+0

這實際上是可能的。如果你真的想要它,我可以爲你製作一個sql。雖然這似乎是一個奇怪的要求。但我想它對於一個從未被插入的其他東西感動的日誌表很有用。 –

+0

我真的很抱歉我有問過這個問題。我不知道這件事,並真的被設置爲投票 –

回答

12

由於ID'的'最後'行既不是最小值也不是最大值,因此您處於輕微混淆狀態。表中的行沒有順序。因此,您應該提供另一列,可能是每行插入的日期/時間,以提供數據的排序。另一個選項可以是一個單獨的,自動遞增的列,用於記錄行插入的順序。然後可以寫入查詢。

如果額外列名爲status_id,那麼你可以寫:

SELECT L1.* 
    FROM LoanTable AS L1 
WHERE L1.Status_ID = (SELECT MAX(Status_ID) 
         FROM LoanTable AS L2 
         WHERE L2.Loan_ID = 1); 

(別名L1和L2的表可以不混淆DBMS或有經驗的SQL程序員省略。)

因爲它站立,沒有可靠的方式知道哪一個是最後一行,所以你的查詢是無法回答的。

+1

謝謝你可能我不知道這一個我應該尋找另一列看看它的最大值 –

2

但如果最後=最後插入的,這是不可能的電流模式,直到PK此外:

select top 1 status, loan_id 
from loanTable 
where loan_id = 1 
order by id desc -- PK 
+0

我不是在尋找這一個。爲什麼按狀態desc命令我不明白。其實我正在查看loan_id 1的最後一個狀態。 –

+0

根據OP的請求,兩個查詢都不返回'4' - 兩個都會返回'6'。 – ain

+0

此查詢幫助我檢索表格中的最新日期。 –

5

請問你的表恰好有一個主ID或時間戳?如果沒有,那麼你想要的是不可能的。

如果是的話:

SELECT TOP 1 status 
    FROM loanTable 
    WHERE loan_id = 1 
    ORDER BY primaryId DESC 
    -- or 
    -- ORDER BY yourTimestamp DESC 
4

我認爲用「最後的狀態」你的意思是插入最近的記錄? AFAIK沒有辦法做出這樣的查詢,除非你添加時間戳記到你的表格中存儲添加記錄的日期和時間。 RDBMS不保留記錄的任何內部順序。

0

使用數據讀取器。當它退出while循環時,它將在最後一行。如其他海報所述,除非您對查詢進行排序,否則行順序可能會更改。即使表上有聚簇索引,它也可能不會以該順序返回行(沒有對聚簇索引進行排序)。

SqlDataReader rdr = SQLcmd.ExecuteReader(); 
    while (rdr.Read()) 
    { 
    } 
    string lastVal = rdr[0].ToString() 
    rdr.Close(); 

您也可以使用ROW_NUMBER(),但需要排序,你不能直接在那裏使用ROW_NUMBER()。但是你可以通過創建一個派生表來欺騙它。上面的rdr解決方案更快。

0

在oracle數據庫中這很簡單。

SELECT * FROM(SELECT * FROM loanTable ORDER BY ROWNUM遞減),其中的rownum = 1

0

嗨,如果這尚未得到解決。 要從表中獲取任何字段的最後一條記錄,最簡單的方法就是爲每個記錄添加一個ID,例如pID。也說,在你的表,你想HHET最後一個記錄每個「名稱」,運行簡單的查詢

SELECT Name, MAX(pID) as LastID 
INTO [TableName] 
FROM [YourTableName] 
GROUP BY [Name]/[Any other field you would like your last records to appear by]  

您現在應該有一個包含一列的名稱,併爲最後一個可用ID表名稱。 現在你可以使用連接到您的主表得到其他細節,說這是一些價格或日期,然後運行以下命令:

SELECT a.*,b.Price/b.date/b.[Whatever other field you want] 
FROM [TableName] a LEFT JOIN [YourTableName] 
ON a.Name = b.Name and a.LastID = b.pID 

這應該然後給你的每一個名稱的最後一個記錄,對於第一條記錄運行與上面相同的查詢,只需將上面的Max替換爲Min即可。

這應該很容易跟隨,並應跑得快以及

0

如果你沒有,你可以用它來獲取插入順序任何標識列。你總是可以這樣做。但它很黑,而且不太漂亮。

select 
t.row1, 
t.row2, 
ROW_NUMBER() OVER (ORDER BY t.[count]) AS rownum from (
select 
    tab.row1, 
    tab.row2, 
    1 as [count] 
from table tab) t 

所以基本上你會得到'自然順序',如果你可以調用它,並添加一些列與所有相同的數據。這可用於按「自然順序」進行排序,讓您有機會在下一個查詢中放置行號列。個人而言,如果您正在使用的系統沒有時間戳/標識列,並且當前用戶正在使用'自然順序',我會快速添加一列並使用此查詢來創建某種類型的時間戳/增量鍵。不要冒着冒着某種自動化機制改變「自然秩序」的風險,打破所需的數據。

0

我覺得這個代碼可以幫助你:

WITH cte_Loans 
AS 
(
SELECT LoanID 
     ,[Status] 
     ,ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS RN 
FROM LoanTable 
) 

SELECT LoanID 
     ,[Status] 
FROM LoanTable L1 
WHERE RN = ( SELECT max(RN) 
       FROM LoanTable L2 
       WHERE L2.LoanID = L1.LoanID) 
+0

添加一些解釋與答案如何這個答案幫助OP在解決當前問題 –

相關問題