Sql server 如何使用GROUPBY(而不是自联接)来获取正确的数据(包括特定示例)

Sql server 如何使用GROUPBY(而不是自联接)来获取正确的数据(包括特定示例),sql-server,tsql,sql-server-2000,group-by,Sql Server,Tsql,Sql Server 2000,Group By,看看相关的问题,我不认为有人问过这个具体的问题,所以我来回答 我曾经有过这样一种情况,我在一张表上加入了三次,以获得基于日期的不同数据 这花费了太长的时间,因此为了优化,我使用下面定义的group by重写了它: 我很难理解逻辑,我开始觉得不可能通过这件事得到我想要的东西。我将向您展示我当前的代码,然后描述我需要从中获得什么(更改表/变量以保护无辜者) 选择 upc, 最大值(在SQLServer2005+中ip\u开始日期时的情况): SELECT upc, retail_today.*,

看看相关的问题,我不认为有人问过这个具体的问题,所以我来回答

我曾经有过这样一种情况,我在一张表上加入了三次,以获得基于日期的不同数据

这花费了太长的时间,因此为了优化,我使用下面定义的group by重写了它:

我很难理解逻辑,我开始觉得不可能通过这件事得到我想要的东西。我将向您展示我当前的代码,然后描述我需要从中获得什么(更改表/变量以保护无辜者)

选择
upc,

最大值(在
SQLServer2005+
中ip\u开始日期时的情况):

SELECT  upc, retail_today.*, retail_next_week.*, retail_two_weeks.*
FROM    items im
OUTER APPLY
        (
        SELECT  TOP 1
                ip_unit_price, ip_price_multiple
        FROM    retail ip
        WHERE   ip.ip_start_date <= GETDATE()
                AND ip.id = im.id
        ORDER BY
                ip_start_date DESC
        ) retail_today
OUTER APPLY
        (
        SELECT  TOP 1
                ip_unit_price, ip_price_multiple
        FROM    retail ip
        WHERE   ip.ip_start_date BETWEEN GETDATE() AND DATEADD(ww, 1, GETDATE())
                AND ip.id = im.id
        ORDER BY
                ip_start_date DESC
        ) retail_next_week
OUTER APPLY
        (
        SELECT  TOP 1
                ip_unit_price, ip_price_multiple
        FROM    retail ip
        WHERE   ip.ip_start_date BETWEEN DATEADD(ww, 1, GETDATE()) AND DATEADD(ww, 2, GETDATE())
                AND ip.id = im.id
        ORDER BY
                ip_start_date DESC
        ) retail_two_weeks

感谢您的快速响应。我将试一试并让您知道它是如何工作的。确认…我应该提到我使用的是SQL Server 2000,而不是2005。这将不起作用。您可以将其移动到
选择
列表子查询中。不完全是我要找的。我在查询中添加了2000代码,但保留了MAX()这要求我在子查询(MAX)中聚合id字段,现在我得到一个“内部SQL错误”…
@IronicMuffin
:对于每个查询,都会返回相应时间间隔内最新零售的价格。这不是您想要的吗?此外,
upc
所属的位置:
项目
零售
SELECT  upc, retail_today.*, retail_next_week.*, retail_two_weeks.*
FROM    items im
OUTER APPLY
        (
        SELECT  TOP 1
                ip_unit_price, ip_price_multiple
        FROM    retail ip
        WHERE   ip.ip_start_date <= GETDATE()
                AND ip.id = im.id
        ORDER BY
                ip_start_date DESC
        ) retail_today
OUTER APPLY
        (
        SELECT  TOP 1
                ip_unit_price, ip_price_multiple
        FROM    retail ip
        WHERE   ip.ip_start_date BETWEEN GETDATE() AND DATEADD(ww, 1, GETDATE())
                AND ip.id = im.id
        ORDER BY
                ip_start_date DESC
        ) retail_next_week
OUTER APPLY
        (
        SELECT  TOP 1
                ip_unit_price, ip_price_multiple
        FROM    retail ip
        WHERE   ip.ip_start_date BETWEEN DATEADD(ww, 1, GETDATE()) AND DATEADD(ww, 2, GETDATE())
                AND ip.id = im.id
        ORDER BY
                ip_start_date DESC
        ) retail_two_weeks
SELECT  upc,
        (
        SELECT  TOP 1
                ip_price
        FROM    retail ip
        WHERE   ip.ip_start_date <= GETDATE()
                AND ip.id = im.id
        ORDER BY
                ip_start_date DESC
        ) AS ip_price_today,
        (
        SELECT  TOP 1
                ip_price_multiple
        FROM    retail ip
        WHERE   ip.ip_start_date <= GETDATE()
                AND ip.id = im.id
        ORDER BY
                ip_start_date DESC
        ) AS ip_price_multiple_today,
        …
FROM    items im