假设我有一张存储比赛结果的表格。每天,有几辆赛车在赛道上比赛,我记录了位置。 (这是一个严格的简化,但它得到了重点)
表格如下:
|Driver | Position | Date
Andy 1 22/06/2011
Paul 2 22/06/2011
Cliff 3 22/06/2011
Andy 2 21/06/2011
Paul 1 21/06/2011
Cliff 3 21/06/2011
等等......
我想写一个查询,它返回给定日期的驾驶员位置,以及前一天的位置。我想要返回以下列:
|Driver | Position | Date | Position Yesterday
Andy 1 22/06/2011 2
Paul 2 22/06/2011 1
Cliff 3 22/06/2011 3
我认为我必须写一个嵌套查询,但我真的不知道从哪里开始。我知道我可以多次调用数据库并在我的应用程序中构建结果,但我觉得这不是最佳实践。
答案 0 :(得分:4)
SELECT
[today].*,
[yesterday].Position
FROM
yourTable AS [today]
LEFT JOIN
yourTable AS [yesterday]
ON [today].Driver = [yesterday].Driver
AND [today].Date = [yesterday].Date + 1
WHERE
[today].Date = '22/06/2011'
答案 1 :(得分:4)
你可能会像这样离开加入:
select
r1.driver,
r1.position,
r1.date
r2.position as prev_pos
from
results r1
left join
results r2 on r1.driver = r2.driver and r2.date = r1 - INTERVAL 1 DAY;
答案 2 :(得分:2)
嵌套似乎表现更好(感谢@Dems的评论) 通过过滤日期自我加入表。使用和索引(驱动程序,日期)组合
SELECT t1.Driver,t1.Position, t1.Date, t2.Position
FROM table t1
LEFT JOIN (SELECT Driver, Position FROM table ON t1.Driver = t2.Driver AND t2.date ='21/06/2001') ON t1.Driver = t2.Driver
WHERE t1.date = '22/06/2011'
答案 3 :(得分:1)
如果您使用的是MS SQL Server 2008,请查看Common Table Expressions
答案 4 :(得分:0)
您可以使用UNION,对第二个查询的第一个结果UNION结果使用一个查询。这应该以正确的方式返回:
SELECT * FROM * WHERE =
UNION
SELECT * FROM * WHERE =
根据您的需要填写*。
答案 5 :(得分:0)
您可以通过加入来搜索前一天。
答案 6 :(得分:0)
我无法在此处测试SQL查询,但这里有一些伪SQL代码,如果转换为正确的SQL可能会有效:
SELECT
today.driver,
today.position,
today.date,
yesterday.position
FROM
your_table today,
( SELECT driver, position, ( date - 1 day ) "date" FROM your_table ) yesterday
WHERE
today.driver = yesterday.driver AND
today.date = yesterday.date
当然,这不是编译,我不是100%肯定where子句。您可能需要执行一些左/右外连接。此外,当最后一场比赛不是昨天,而是前一天,你会遇到问题。
希望这无论如何都有帮助。
答案 7 :(得分:0)
另一种选择:
@givendate = '22/06/2011'
SELECT t1.Driver
, t1.Position
, t1.Date
, ( SELECT t2.Position
FROM table t2
WHERE t2.Driver = t1.Driver
AND t2.date = DATEADD(day, @givendate, -1)
) AS PositionYesterday
FROM table t1
WHERE t1.date = @givendate