如何根据下一条记录的值对记录进行分组?

时间:2016-02-02 01:23:00

标签: sql-server

我正在尝试将基于日期/时间戳记的资产跟踪记录组合在一起,并且我很难过,希望有人能够轻松实现这一目标。

我有一个包含以下列的表:

  • ASSET_ID
  • date_time_stamp
  • ZONE_NAME

示例数据集如下所示:

09 , 2016-02-01 18:57:23.000 , zone_0
10 , 2016-02-01 18:57:23.000 , zone_1
10 , 2016-02-01 18:57:34.000 , zone_1
10 , 2016-02-01 18:57:45.000 , zone_2
11 , 2016-02-01 18:56:17.000 , zone_3
11 , 2016-02-01 18:56:32.000 , zone_3
11 , 2016-02-01 18:56:43.000 , zone_3
11 , 2016-02-01 18:56:48.000 , zone_3
12 , 2016-02-01 18:56:43.000 , zone_1
12 , 2016-02-01 18:56:53.000 , zone_1
12 , 2016-02-01 18:57:54.000 , zone_3
12 , 2016-02-01 18:59:01.000 , zone_3
12 , 2016-02-01 18:59:14.000 , zone_1
12 , 2016-02-01 18:59:45.000 , zone_1
10 , 2016-02-01 18:58:23.000 , zone_1
10 , 2016-02-01 18:59:56.000 , zone_1

我想知道的是,在移动到下一个区域之前,每个资产在区域中花费了多长时间?我无法在zone_name上进行分组,因为我想知道资产从区域1移动到区域2然后再次回到区域1。

我正在寻找的输出是:

  • ASSET_ID
  • ZONE_NAME
  • date_time_stamp_entered_zone
  • date_time_stamp_exited_zone

使用以下数据集:

09 , zone_0 , 2016-02-01 18:57:23.000 , 2016-02-01 18:57:34.000
10 , zone_1 , 2016-02-01 18:57:23.000 , 2016-02-01 18:57:34.000
10 , zone_2 , 2016-02-01 18:57:45.000 , 2016-02-01 18:57:45.000
10 , zone_1 , 2016-02-01 18:58:23.000 , 2016-02-01 18:59:56.000
11 , zone_3 , 2016-02-01 18:56:43.000 , 2016-02-01 18:56:48.000
12 , zone_1 , 2016-02-01 18:56:43.000 , 2016-02-01 18:56:53.000
12 , zone_3 , 2016-02-01 18:57:54.000 , 2016-02-01 18:59:01.000
12 , zone_1 , 2016-02-01 18:59:14.000 , 2016-02-01 18:59:14.000

1 个答案:

答案 0 :(得分:1)

您需要识别相同的区域组。一种技术是“行数差异”方法。这将为每个区域分配一个分组ID,然后可以将其用于聚合:

select asset_id, zone_name, min(date_time_stamp), max(date_time_stamp)
from (select t.*,
             (row_number() over (partition by asset_id order by date_time_stamp) -
              row_number() over (partition by asset_id, zone_name order by date_time_stamp)
              ) as grp              
      from t
     ) t
group by asset_id, zone_name, grp;

这种方法中的“魔力”是行数的差异。我建议您运行子查询以查看它产生的内容。 。 。您还可以单独计算行数,以便更好地了解它的工作原理。