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