我们有 7 个人在波兰旅行 ( ;) )。问题是找到他们访问华沙后访问过的最多三个下一个城市。如果一个人去过华沙两次,也算作下一次旅行的起点。 例如,家伙 1 不仅有过旅行——华沙、克拉科夫、华沙、格但斯克,还有华沙、格但斯克。
表A
+------+-----------+-----+
| date | city | guy |
+------+-----------+-----+
| 2 | Warsaw | 1 |
| 4 | Cracow | 1 |
| 5 | Cracow | 2 |
| 6 | Bialystok | 3 |
| 7 | Warsaw | 1 |
| 8 | Gdansk | 1 |
| 10 | Warsaw | 5 |
| 12 | Cracow | 5 |
| 14 | Bialystok | 6 |
| 15 | Warsaw | 7 |
| 20 | Warsaw | 7 |
+------+-----------+-----+
所以最终的表格看起来是这样的:
+-----------+-----------+-----------+-----------+
| Starting | 2nd dest. | 3th dest. | 4th dest. |
+-----------+-----------+-----------+-----------+
| Warsaw | Cracow | Warsaw | Gdansk |
| Warsaw | Gdansk | | |
| Warsaw | Cracow | | |
| Warsaw | Warsaw | | |
| Warsaw | | | |
+-----------+-----------+-----------+-----------+
问题是创建一个查询,该查询将自动从表 A 创建最终表。
找到每个起点没有问题,但我不知道如何找到每个第二个目的地。在我看来,必须有某种循环——这个人必须与起点相同,第二个目的地的日期必须大于这个确切起点的日期。
如能帮助解决此问题,我们将不胜感激。 ;)
带有更多示例条目数据的 SQLFiddle - http://sqlfiddle.com/#!2/de0f1 上面的数据只是一个示例,解决方案需要处理更大的数据集。
最佳答案
如果您使用的是 SQL Server 2012 或更高版本,您可以很容易地 solve the problem在 LEAD() analytic function 的帮助下:
WITH ThreeDestinations AS (
SELECT
*,
Destination2 = LEAD(city, 1) OVER (PARTITION BY guy ORDER BY date),
Destination3 = LEAD(city, 2) OVER (PARTITION BY guy ORDER BY date),
Destination4 = LEAD(city, 3) OVER (PARTITION BY guy ORDER BY date)
FROM
dbo.voyage
)
SELECT
StartingPoint = city,
Destination2,
Destination3,
Destination4
FROM
ThreeDestinations
WHERE
city = 'Warsaw'
ORDER BY
date
;
对 LEAD 的三个调用为您提供了原始集中每个城市之后的前三个(或更少)目的地。下一步,也是最后一步,就是过滤掉起点不是华沙的行。
关于sql - 选择满足条件的行后三行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24829175/