當值超過某個點時,我必須從資料庫中回傳行。
我應該得到足夠的行來總結一個大于我的數量的值并停止檢索行。
這可能嗎?有意義嗎?這可以轉移到 LINQ for EF core 中嗎?
我目前堅持使用將回傳所有行的查詢...
SELECT [i].[InventoryArticleId], [i].[ArticleId], [i].[ArticleQuantity], [i].[InventoryId]
FROM [InventoryArticle] AS [i]
INNER JOIN [Article] AS [a] ON [i].[ArticleId] = [a].[ArticleId]
WHERE (([i].[ArticleId] = 1) AND ([a].[ArticlePrice] <= 1500))
AND ((
SELECT COALESCE(SUM([i0].[ArticleQuantity]), 0)
FROM [InventoryArticle] AS [i0]
INNER JOIN [Article] AS [a0] ON [i0].[ArticleId] = [a0].[ArticleId]
WHERE ([i0].[ArticleId] = 1) AND ([a0].[ArticlePrice] < 1500)) > 10)

預期結果是一行。如果數字大于 34,則應添加更多行。

uj5u.com熱心網友回復:
您可以使用視窗SUM來計算運行總和ArticleQuantity。它可能比自聯接更有效。
訣竅是您需要所有與前一行的總和小于要求的行。
你可以利用
ROWS的條款ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING。但是你需要NULL在第一行處理可能的s。在任何情況下,即使是常規的運行總和也應始終使用
ROWS UNBOUNDED PRECEDING,因為默認值為RANGE UNBOUNDED PRECEDING,它略有不同,可能導致不正確的結果,并且速度較慢。
DECLARE @requirement int = 10;
SELECT
i.InventoryArticleId,
i.ArticleId,
i.ArticleQuantity,
i.InventoryId
FROM (
SELECT
i.*,
RunningSum = SUM(i.ArticleQuantity) OVER (PARTITION BY i.ArticleId ORDER BY i.InventoryArticleId ROWS UNBOUNDED PRECEDING)
FROM InventoryArticle i
INNER JOIN Article a ON i.ArticleId = a.ArticleId
WHERE i.ArticleId = 1
AND a.ArticlePrice <= 1500
) i
WHERE i.RunningSum - i.ArticleQuantity < @requirement;
您可能想要選擇一個更好的排序子句。
EF Core 不能使用視窗函式,除非你專門SqlExpression為它定義了一個。
uj5u.com熱心網友回復:
我的方法是:
- 篩選符合條件的記錄。
- 計算運行總數。
- 確定運行總計滿足您的條件的第一條記錄。
- 對所有符合條件的記錄執行最終選擇。
類似于以下稍微精簡的示例:
-- Some useful generated data
DECLARE @Inventory TABLE (InventoryArticleId INT, ArticleId INT, ArticleQuantity INT)
INSERT @Inventory(InventoryArticleId, ArticleId, ArticleQuantity)
SELECT TOP 1000
InventoryArticleId = N.n,
ArticleId = N.n % 5,
ArticleQuantity = 5 * N.n
FROM (
-- Generate a range of integers
SELECT n = ones.n 10*tens.n 100*hundreds.n 1000*thousands.n
FROM (VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) ones(n),
(VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) tens(n),
(VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) hundreds(n),
(VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) thousands(n)
ORDER BY 1
) N
ORDER BY N.n
SELECT * FROM @Inventory
DECLARE @ArticleId INT = 2
DECLARE @QuantityNeeded INT = 500
;
WITH isum as (
SELECT i.*, runningTotalQuantity = SUM(i.ArticleQuantity) OVER(ORDER BY i.InventoryArticleId)
FROM @Inventory i
WHERE i.ArticleId = @ArticleId
)
SELECT isum.*
FROM (
SELECT TOP 1 InventoryArticleId
FROM isum
WHERE runningTotalQuantity >= @QuantityNeeded
ORDER BY InventoryArticleId
) selector
JOIN isum ON isum.InventoryArticleId <= selector.InventoryArticleId
ORDER BY isum.InventoryArticleId
結果:
| 庫存商品編號 | 文章編號 | 文章數量 | 運行總數量 |
|---|---|---|---|
| 2 | 2 | 10 | 10 |
| 7 | 2 | 35 | 45 |
| 12 | 2 | 60 | 105 |
| 17 | 2 | 85 | 190 |
| 22 | 2 | 110 | 300 |
| 27 | 2 | 135 | 435 |
| 32 | 2 | 160 | 595 |
運行總計計算、選擇器和最終選擇中的所有 ORDER BY 子句必須一致且明確(無重復)。如果需要更復雜的順序或偏好,則可能需要在計算運行總計之前為符合條件的記錄分配一個等級值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/383187.html
標籤:sql sql-server 数据库
上一篇:資料庫類-表存在嗎?
