sql - 选择满足条件的行后三行

标签 sql sql-server database

我们有 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 problemLEAD() 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/

相关文章:

php - SQL查询以查找欠债三个月或更长时间的用户

sql - Spark SQL 传递变量

sql - MS SQL服务器: Check to see if a user can execute a stored procedure

sql - 使用Elastic查询中的值列表检查字段的值

java - JPA事务隔离和实体锁的区别

sql - 使用什么数据类型在数据库中存储不同的文件

sql-server - SQL Server 和 IN 子句中大范围值的效率

sql-server - SqlServer触发器可以推送到ActiveMQ吗

C# Datetime 插入 SQL Server 值,精确到微秒

sql - 如何创建一个表示字段不等于 X 的联接?