我有loanTable
含有兩個領域loan_id
和status
獲取最後一條記錄在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即Status
是status
4.可以幫我在這個查詢中。
我有loanTable
含有兩個領域loan_id
和status
獲取最後一條記錄在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即Status
是status
4.可以幫我在這個查詢中。
由於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程序員省略。)
因爲它站立,沒有可靠的方式知道哪一個是最後一行,所以你的查詢是無法回答的。
謝謝你可能我不知道這一個我應該尋找另一列看看它的最大值 –
但如果最後=最後插入的,這是不可能的電流模式,直到PK此外:
select top 1 status, loan_id
from loanTable
where loan_id = 1
order by id desc -- PK
我不是在尋找這一個。爲什麼按狀態desc命令我不明白。其實我正在查看loan_id 1的最後一個狀態。 –
根據OP的請求,兩個查詢都不返回'4' - 兩個都會返回'6'。 – ain
此查詢幫助我檢索表格中的最新日期。 –
請問你的表恰好有一個主ID或時間戳?如果沒有,那麼你想要的是不可能的。
如果是的話:
SELECT TOP 1 status
FROM loanTable
WHERE loan_id = 1
ORDER BY primaryId DESC
-- or
-- ORDER BY yourTimestamp DESC
我認爲用「最後的狀態」你的意思是插入最近的記錄? AFAIK沒有辦法做出這樣的查詢,除非你添加時間戳記到你的表格中存儲添加記錄的日期和時間。 RDBMS不保留記錄的任何內部順序。
使用數據讀取器。當它退出while循環時,它將在最後一行。如其他海報所述,除非您對查詢進行排序,否則行順序可能會更改。即使表上有聚簇索引,它也可能不會以該順序返回行(沒有對聚簇索引進行排序)。
SqlDataReader rdr = SQLcmd.ExecuteReader();
while (rdr.Read())
{
}
string lastVal = rdr[0].ToString()
rdr.Close();
您也可以使用ROW_NUMBER(),但需要排序,你不能直接在那裏使用ROW_NUMBER()。但是你可以通過創建一個派生表來欺騙它。上面的rdr解決方案更快。
在oracle數據庫中這很簡單。
SELECT * FROM(SELECT * FROM loanTable ORDER BY ROWNUM遞減),其中的rownum = 1
嗨,如果這尚未得到解決。 要從表中獲取任何字段的最後一條記錄,最簡單的方法就是爲每個記錄添加一個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即可。
這應該很容易跟隨,並應跑得快以及
如果你沒有,你可以用它來獲取插入順序任何標識列。你總是可以這樣做。但它很黑,而且不太漂亮。
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
所以基本上你會得到'自然順序',如果你可以調用它,並添加一些列與所有相同的數據。這可用於按「自然順序」進行排序,讓您有機會在下一個查詢中放置行號列。個人而言,如果您正在使用的系統沒有時間戳/標識列,並且當前用戶正在使用'自然順序',我會快速添加一列並使用此查詢來創建某種類型的時間戳/增量鍵。不要冒着冒着某種自動化機制改變「自然秩序」的風險,打破所需的數據。
我覺得這個代碼可以幫助你:
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)
添加一些解釋與答案如何這個答案幫助OP在解決當前問題 –
如果沒有「序列」列或日期或東西,你永遠無法找到以一致的方式「最後」的地位。根據你的表索引的方式,如果你的查詢計劃將使用多個CPU等等,你將得到不一致的結果。 –
這實際上是可能的。如果你真的想要它,我可以爲你製作一個sql。雖然這似乎是一個奇怪的要求。但我想它對於一個從未被插入的其他東西感動的日誌表很有用。 –
我真的很抱歉我有問過這個問題。我不知道這件事,並真的被設置爲投票 –