我對 SQL 查詢的邏輯有疑問,請幫助我解決這個問題。
如何在 SQL Server 中為單個發票編號選擇具有最早過帳日期的行:
現有表:
| 發票編號 | 姓名 | 發布日期 | 地方 |
|---|---|---|---|
| 2050 | 恐龍 | 20.05.1998 | 倫敦 |
| 2050 | 恐龍 | 25.04.1995 | 澳大利亞 |
| 2045 | 鳥類 | 18.03.1997 | 美國 |
| 2045 | 鳥類 | 27.07.1995 | 中國 |
| 2075 | 獅子 | 12.06.2012 | 印度 |
我想像這樣查詢輸出:
| 發票編號 | 姓名 | 發布日期 | 地方 |
|---|---|---|---|
| 2050 | 恐龍 | 25.04.1995 | 澳大利亞 |
| 2045 | 鳥類 | 27.07.1995 | 中國 |
| 2075 | 獅子 | 12.06.2012 | 印度 |
我正在努力解決如何比較兩個發布日期的日期并為 SQL Server 中的每個發票編號回傳具有最低發布日期列值的行的邏輯。
我嘗試使用MIN()和INNER JOIN之前,但它對我復雜的代碼庫沒有幫助,所以我在這里以簡單的方式顯示它。
編輯:從上一個更新我希望此更改僅發生在新創建的發票上,而不是現有的發票,因此我希望在發票日期大于特定日期或其他方式僅在發票編號為已經存在于資料庫中并且對于同一個發票編號也有兩個過帳日期。
如果發票日期在示例資料庫中不存在并且有兩個過帳日期,則查詢應生成一個表格,然后它應顯示具有最早過帳日期(具有相同發票編號)的單行,例如:china
如果發票日期存在于示例資料庫中并且有兩個過帳日期,那么它應該顯示具有相同發票編號的所有行而沒有更改,例如:倫敦,澳大利亞
其他具有單一發布日期的行(無論它們是否存在于示例資料庫中),它們應該顯示它們的行。例如:印度
現有示例表:
| 發票編號 | 姓名 | 發票日期 | 發布日期 | 地方 |
|---|---|---|---|---|
| 2050 | 恐龍 | 20.03.1999 | 20.05.1998 | 倫敦 |
| 2050 | 恐龍 | 20.03.1999 | 25.04.1995 | 澳大利亞 |
| 2045 | 鳥類 | 26.06.2005 | 18.03.1997 | 美國 |
| 2045 | 鳥類 | 26.06.2005 | 27.07.1995 | 中國 |
| 2075 | 獅子 | 22.04.2012 | 12.06.2012 | 印度 |
我想作為單個查詢進行查詢以顯示如下輸出:
| 發票編號 | 姓名 | 發票日期 | 發布日期 | 地方 |
|---|---|---|---|---|
| 2050 | 恐龍 | 20.03.1999 | 20.05.1998 | 倫敦 |
| 2050 | 恐龍 | 20.03.1999 | 25.04.1995 | 澳大利亞 |
| 2045 | 鳥類 | 26.06.2005 | 27.07.1995 | 中國 |
| 2075 | 獅子 | 22.04.2012 | 12.06.2012 | 印度 |
我無法將其作為單個 SELECT 查詢,并且我還檢查了特定日期而不是檢查資料庫,它也失敗了。請幫我解決這個問題。
備注:這是示例表,它將用代碼庫中的動態列填充動態值,因此,省略美國行是我不期望的輸出,基于邏輯的輸出是期望的輸出。
謝謝
uj5u.com熱心網友回復:
窗函式是你的朋友。非常值得您花時間與他們相處。也不清楚你是否需要NAME在partition by
另外,如果您想查看領帶...使用dense_rank()而不是row_number()
性能更高
Select *
From (
Select *
,RN = row_number() over (partition by InvoiceNumber,Name order by PostingDate)
From YourTable
) A
Where RN=1
另外一個選項
Select top 1 with ties *
From YourTable
Order by row_number() over (partition by InvoiceNumber,Name order by PostingDate)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/371559.html
標籤:sql sql-server 查询语句 逻辑
下一篇:從字串中獲取最后一組數字
