Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 为所有行返回相同值的行号(+查询性能)_Sql Server_Tsql_Row Number - Fatal编程技术网

Sql server 为所有行返回相同值的行号(+查询性能)

Sql server 为所有行返回相同值的行号(+查询性能),sql-server,tsql,row-number,Sql Server,Tsql,Row Number,我构建了以下查询来展示这个问题 WITH CategoryPromotions AS ( SELECT CategoryId = 7, Price = 10 UNION ALL SELECT CategoryId = 3, Price = 15 UNION ALL SELECT CategoryId = 1, Price = 5 ) , Product

我构建了以下查询来展示这个问题

WITH
    CategoryPromotions
    AS
    (
        SELECT CategoryId = 7, Price = 10
             UNION ALL
        SELECT CategoryId = 3, Price = 15
             UNION ALL
        SELECT CategoryId = 1, Price = 5
    )
,
       Products
       AS
       (
             SELECT Id = 1, Price = 20
       )
,
       ProductsCategories
       AS
       (
             SELECT ProductId = 1, CategoryId = 2
             UNION ALL
             SELECT ProductId = 1, CategoryId = 8
             UNION ALL
             SELECT ProductId = 1, CategoryId = 6
       )
,
       Tally
       AS
       (
             SELECT N = 1
             UNION ALL
             SELECT N = 2
             UNION ALL
             SELECT N = 3
             UNION ALL
             SELECT N = 4
             UNION ALL
             SELECT N = 5
       )
,
       Hierarchy
       AS
       (
             SELECT Id = 2, SortPath = 0x00000001000000070000000400000002
             UNION ALL
             SELECT Id = 8, SortPath = 0x00000001000000070000000400000008
             UNION ALL
             SELECT Id = 6, SortPath = 0x0000000300000006
       )
SELECT ProductsCategories.*, xD.*
FROM Products
       RIGHT JOIN ProductsCategories
             ON Products.Id = ProductsCategories.ProductId
       CROSS APPLY
       (
             SELECT TOP (1) promos.CategoryId
                    , Products.Price AS BasePrice
                    , promos.Price
                    , (
                        CASE
                            WHEN promos.Price IS NOT NULL THEN
                                (Products.Price - promos.Price)
                            ELSE
                                Products.Price
                        END
                    ) AS DiscountedPrice
                    , ROW_NUMBER() OVER
                    (
                           ORDER BY CASE
                                  WHEN promos.Price IS NOT NULL THEN
                                        (Products.Price - promos.Price)
                                  ELSE
                                        Products.Price
                                  END
                           ASC
                    ) AS PriceRank
             FROM (SELECT ProductsCategories.ProductId, ProductsCategories.CategoryId) bpc
                    CROSS APPLY
                    (
                           SELECT TOP (1) categories.CategoryId
                                  , catpromo.Price
                           FROM
                                  (
                                        SELECT CategoryId = CAST(SUBSTRING(Hierarchy.SortPath,Tally.N,4) AS INT)
                                               , Tally.N
                                        FROM Hierarchy
                                               INNER JOIN Tally
                                                      ON Tally.N BETWEEN 1
                                                      AND DATALENGTH(Hierarchy.SortPath)
                                        WHERE Hierarchy.Id = bpc.CategoryId
                                        GROUP BY SUBSTRING(Hierarchy.SortPath,tally.N,4)
                                               , tally.n
                                  ) AS categories
                                  INNER JOIN CategoryPromotions catpromo
                                        ON categories.CategoryId = catpromo.CategoryId
                           ORDER BY categories.N DESC
                    ) AS promos
             WHERE bpc.ProductId = 1
             ORDER BY PriceRank
       ) AS XD
WHERE products.Id = 1;
这是查询结果:

为什么排号不起作用?我可以做些什么来提高查询性能吗?这将应用于每个产品的一百万行结果查询。我试图伪造它将用于的结构

所需的结果是具有最低折扣价格的1行。无法使用MIN,因为我需要所有列

编辑:没有前1名


行号工作正常。问题是您正在为ProductCategories表中的每一行计算它。以下是您的查询的较轻版本

WITH cteProductsCategoriesDiscounts AS(
    SELECT 
          ProductsCategories.ProductId
        , ProductsCategories.CategoryId
        , promos.CategoryId AS promoCategoryId
        , Products.Price AS BasePrice
        , promos.Price
        , ISNULL(Products.Price - promos.Price, Products.Price) AS DiscountedPrice
        , ROW_NUMBER() OVER ( PARTITION BY ProductsCategories.ProductId ORDER BY ISNULL(Products.Price - promos.Price, Products.Price) ) AS PriceRank
    FROM Products
    RIGHT JOIN ProductsCategories ON Products.Id = ProductsCategories.ProductId
    CROSS APPLY (
                SELECT  TOP (1)
                          CAST(SUBSTRING(Hierarchy.SortPath,N*4-3,4) AS INT) AS CategoryId
                        , catpromo.Price
                FROM Hierarchy
                INNER JOIN Tally t ON t.N BETWEEN t.n AND DATALENGTH(Hierarchy.SortPath)/4
                INNER JOIN CategoryPromotions catpromo ON CAST(SUBSTRING(Hierarchy.SortPath,N*4-3,4) AS INT) = catpromo.CategoryId
                WHERE Hierarchy.Id = ProductsCategories.CategoryId
                ORDER BY t.N
        ) AS promos
    WHERE ProductsCategories.ProductId = 1
)
SELECT *
FROM cteProductsCategoriesDiscounts
WHERE PriceRank = 1;

编辑:进行了调整以允许多个产品。

行号工作正常。问题是您正在为ProductCategories表中的每一行计算它。以下是您的查询的较轻版本

WITH cteProductsCategoriesDiscounts AS(
    SELECT 
          ProductsCategories.ProductId
        , ProductsCategories.CategoryId
        , promos.CategoryId AS promoCategoryId
        , Products.Price AS BasePrice
        , promos.Price
        , ISNULL(Products.Price - promos.Price, Products.Price) AS DiscountedPrice
        , ROW_NUMBER() OVER ( PARTITION BY ProductsCategories.ProductId ORDER BY ISNULL(Products.Price - promos.Price, Products.Price) ) AS PriceRank
    FROM Products
    RIGHT JOIN ProductsCategories ON Products.Id = ProductsCategories.ProductId
    CROSS APPLY (
                SELECT  TOP (1)
                          CAST(SUBSTRING(Hierarchy.SortPath,N*4-3,4) AS INT) AS CategoryId
                        , catpromo.Price
                FROM Hierarchy
                INNER JOIN Tally t ON t.N BETWEEN t.n AND DATALENGTH(Hierarchy.SortPath)/4
                INNER JOIN CategoryPromotions catpromo ON CAST(SUBSTRING(Hierarchy.SortPath,N*4-3,4) AS INT) = catpromo.CategoryId
                WHERE Hierarchy.Id = ProductsCategories.CategoryId
                ORDER BY t.N
        ) AS promos
    WHERE ProductsCategories.ProductId = 1
)
SELECT *
FROM cteProductsCategoriesDiscounts
WHERE PriceRank = 1;

编辑:进行了调整以允许多个产品。

因为您选择了TOP1,您希望得到什么结果?如果我删除TOP1,它不会改变最终结果请参见编辑,我希望得到我在帖子中所说的内容,并且需要帮助才能实现。在这种情况下,最终结果将是最后一行,因为折扣价格是最低的,因为您选择TOP1你期望什么结果?如果我删除TOP1,它不会改变最终结果请参见编辑,我期望我在帖子中所说的内容,并需要帮助才能实现。在这种情况下,最终结果将是最后一行,因为折扣价格是最低的,谢谢您的快速响应。我最关心的是这一行:右键连接ProductsCategories ON Products.Id=ProductsCategories.ProductId实际的查询非常大,并且有很多东西在进行。在引入这个计算之后,它与我在10秒到1米:05秒之间工作的版本一致。明天当我有权访问包含数据的实际数据库时,我将尝试使用您的版本。这就是为什么我尝试使用已经连接的表而不是正确的连接,但明天将使用此版本重试。提前谢谢你。有必要加入吗?不是所有的产品都应该在products表中吗?实际的数据库有一个ProductTable->ProductCategories->Category,它具有自引用的parentCategory->CategoryPromotions。我必须列出一个类别中的所有产品,然后再往上爬,直到我找到一个晋升机会。请参阅相关问题:然后是其他关于税收、国际化的表格。这里面有很多东西。最大的考验是一只猫。这将返回99992条记录,我必须计算每10秒的时间加上这个问题使它上升到1m+,顺便说一句,您忘记了我假设多个产品的行号中按ProductsCategories.ProductId划分的分区,我忘了包括它,因为它不在您的查询中,而且我没有添加附加产品的测试日期。您好,谢谢您的快速响应。我最关心的是这一行:右键连接ProductsCategories ON Products.Id=ProductsCategories.ProductId实际的查询非常大,并且有很多东西在进行。在引入这个计算之后,它与我在10秒到1米:05秒之间工作的版本一致。明天当我有权访问包含数据的实际数据库时,我将尝试使用您的版本。这就是为什么我尝试使用已经连接的表而不是正确的连接,但明天将使用此版本重试。提前谢谢你。有必要加入吗?不是所有的产品都应该在products表中吗?实际的数据库有一个ProductTable->ProductCategories->Category,它具有自引用的parentCategory->CategoryPromotions。我必须列出一个类别中的所有产品,然后再往上爬,直到我找到一个晋升机会。请参阅相关问题:然后是其他关于税收、国际化的表格。这里面有很多东西。最大的考验是一只猫。这将返回99992条记录,我必须计算每10秒所需的时间,再加上将其提高到1m+的问题,顺便说一句,您忘记了我假设多个产品的行_编号中按ProductsCategories.ProductId划分的分区,我忘记了将其包括在内,因为它不在您的查询中,并且我没有添加附加产品的测试日期。