久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

查找與 Min/Max 關聯的行,沒有內部循環

Find the row associated with a Min/Max, without inner loop(查找與 Min/Max 關聯的行,沒有內部循環)
本文介紹了查找與 Min/Max 關聯的行,沒有內部循環的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

我有一個關于 T-SQL 和 SQL Server 的問題.

I have a question related to T-SQL and SQL Server.

假設我有一個包含 2 列的 Orders 表:

Let's say I have a table Orders with 2 columns:

  • ProductId int
  • CustomerId int
  • 日期日期時間

我想要每個產品的第一個訂單的日期,所以我執行這種類型的查詢:

I want the date of the first order for every product, so I perform this type of query:

SELECT ProductId, MIN(Date) AS FirstOrder 
FROM Orders
GROUP BY ProductId

我在 ProductId 上有一個索引,包括列 CustomerIdDate 以加快查詢速度 (IX_Orders>).查詢計劃看起來像是對 IX_Orders 的非聚集索引掃描,然后是流聚合(由于索引沒有排序).

I have an index on ProductId, including the columns CustomerId and Date to speed up the query (IX_Orders). The query plan looks like a non-clustered index scan on IX_Orders, followed by a stream aggregate (no sort thanks to the index).

現在我的問題是我還想檢索與每個產品的第一個訂單相關聯的 CustomerId(產品 26 于 25 日星期二由客戶 12 首次訂購).棘手的部分是我不希望在執行計劃中有任何內部循環,因為這意味著表中每個 ProductId 的額外讀取,這是非常低效的.

Now my problem is that I also want to retrieve the CustomerId associated with the first order for each product (Product 26 was first ordered on Tuesday 25, by customer 12). The tricky part is that I don't want any inner loop in the execution plan, because it would mean an additional read per ProductId in the table, which is highly inefficient.

這應該可以使用相同的非聚集索引掃描,然后是流聚合,但是我似乎找不到可以做到這一點的查詢.有什么想法嗎?

This should just be possible using the same non-clustered index scan, followed by stream aggregates, however I can't seem to find a query that would do that. Any idea?

謝謝

推薦答案

這將處理具有重復日期的產品:

this will handle products that have duplicate dates:

DECLARE @Orders table (ProductId int
                      ,CustomerId int
                      ,Date datetime
                      )

INSERT INTO @Orders VALUES (1,1,'20090701')
INSERT INTO @Orders VALUES (2,1,'20090703')
INSERT INTO @Orders VALUES (3,1,'20090702')
INSERT INTO @Orders VALUES (1,2,'20090704')
INSERT INTO @Orders VALUES (4,2,'20090701')
INSERT INTO @Orders VALUES (1,3,'20090706')
INSERT INTO @Orders VALUES (2,3,'20090704')
INSERT INTO @Orders VALUES (4,3,'20090702')
INSERT INTO @Orders VALUES (5,5,'20090703')  --duplicate dates for product #5
INSERT INTO @Orders VALUES (5,1,'20090703')  --duplicate dates for product #5
INSERT INTO @Orders VALUES (5,5,'20090703')  --duplicate dates for product #5

;WITH MinOrders AS
(SELECT
     o.ProductId, o.CustomerId, o.Date
         ,row_number() over(partition by o.ProductId order by o.ProductId,o.CustomerId) AS RankValue
     FROM @Orders o
     INNER JOIN (SELECT
                     ProductId
                         ,MIN(Date) MinDate 
                     FROM @Orders 
                     GROUP BY ProductId
                ) dt ON o.ProductId=dt.ProductId AND o.Date=dt.MinDate
 )
SELECT
    m.ProductId, m.CustomerId, m.Date
    FROM MinOrders  m
    WHERE m.RankValue=1
    ORDER BY m.ProductId, m.CustomerId

這將返回相同的結果,只需使用與上述代碼相同的聲明和插入:

this will return the same results, just use the same declare and inserts as the above code:

;WITH MinOrders AS
(SELECT
     o.ProductId, o.CustomerId, o.Date
         ,row_number() over(partition by o.ProductId order by o.ProductId,o.CustomerId) AS RankValue
     FROM @Orders o
 )
SELECT
    m.ProductId, m.CustomerId, m.Date
    FROM MinOrders  m
    WHERE m.RankValue=1
    ORDER BY m.ProductId, m.CustomerId

您可以嘗試每個版本,看看哪個版本運行得更快...

You can try out each version to see which will run faster...

這篇關于查找與 Min/Max 關聯的行,沒有內部循環的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

Converting Every Child Tags in to a Single Column with multiple Delimiters -SQL Server (3)(將每個子標記轉換為具有多個分隔符的單列-SQL Server (3))
How can I create a view from more than one table?(如何從多個表創建視圖?)
Create calculated value based on calculated value inside previous row(根據前一行內的計算值創建計算值)
How do I stack the first two columns of a table into a single column, but also pair third column with the first column only?(如何將表格的前兩列堆疊成一列,但也僅將第三列與第一列配對?) - IT屋-程序員軟件開發技
Recursive t-sql query(遞歸 t-sql 查詢)
Convert Month Name to Date / Month Number (Combinations of Questions amp; Answers)(將月份名稱轉換為日期/月份編號(問題和答案的組合))
主站蜘蛛池模板: 人人人人干 | 国产欧美在线播放 | 五月天婷婷综合 | 国产精品一区网站 | 久草视频在线播放 | av国产在线观看 | 日日摸夜夜添夜夜添特色大片 | 噜久寡妇噜噜久久寡妇 | 日本一卡精品视频免费 | 亚洲精品乱码8久久久久久日本 | 久久专区| 中文字幕国产视频 | 成人美女免费网站视频 | 亚洲综合无码一区二区 | 欧美在线观看免费观看视频 | 日韩欧美成人精品 | 国产日韩欧美在线 | 久久久久网站 | 四虎最新 | 国产精品一级在线观看 | 99久久中文字幕三级久久日本 | 日韩视频精品 | 最近中文字幕在线视频1 | 蜜桃传媒一区二区 | 在线亚洲一区二区 | av天天看| 日韩电影一区 | 91一区二区三区在线观看 | 成人在线观看免费爱爱 | 亚洲免费网 | 一级做受毛片免费大片 | 久久精品欧美一区二区三区不卡 | 国产 亚洲 网红 主播 | 性一爱一乱一交一视频 | 国产精品久久久久久亚洲调教 | 国产在线精品一区二区三区 | 91xxx在线观看 | 日韩av成人在线 | 亚洲最大av| av毛片在线播放 | 国产精品国产成人国产三级 |