2016-05-01 9 views
0

私はSQLで〜1500万レコードのデータセットをクエリしています。SQLでの複雑なグループ化

このようにデータをグループ化してソートしました。

TruckID RoadID Date Time I want this 
Truck1 200 22-Jan-15 9:33:01 AM 1 
Truck1 200 22-Jan-15 9:34:18 AM 1 
Truck1 200 22-Jan-15 11:10:56 AM 2 
Truck1 200 22-Jan-15 11:11:30 AM 2 
Truck12 150 22-Jan-15 5:41:45 PM 1 
Truck12 150 22-Jan-15 5:41:55 PM 1 
Truck12 150 22-Jan-15 11:03:01 PM 2 
Truck12 150 22-Jan-15 11:03:41 PM 2 
Truck12 150 22-Jan-15 11:45:37 PM 3 
Truck16 330 22-Jan-15 2:18:22 AM 1 
Truck16 330 22-Jan-15 2:35:25 AM 2 
Truck16 330 22-Jan-15 2:35:50 AM 2 
Truck2 500 22-Jan-15 10:00:12 AM 1 
Truck2 500 22-Jan-15 10:00:22 AM 1 
Truck2 500 22-Jan-15 10:35:55 AM 2 
Truck7 10 22-Jan-15 7:15:08 AM 1 
Truck7 10 22-Jan-15 7:15:45 AM 1 
Truck7 10 22-Jan-15 11:10:56 AM 2 
Truck8 20 22-Jan-15 1:15:07 PM 1 
Truck8 20 22-Jan-15 1:16:07 PM 1 
Truck8 20 22-Jan-15 1:55:10 PM 2 
Truck8 20 22-Jan-15 1:55:10 PM 2 

私はI want thisフィールドに値を作成するためのSQLでの方法があるかどうかを知りたいです。ロジックは、同じRoadID上の同じTruckIDのTimeフィールドにタイムスタンプ間に2分(120秒)以上のギャップがある場合、そのTruckIDのI want thisフィールドに新しい値(1ずつ増分)を作成する必要があります-RoadIDグループ化。ありがとうございました。

+2

どのDBMSを使用していますか? –

+0

@a_horse_with_no_nameこのデータは、実際にはSpark RDDに格納されています。 SparkのSQL文脈を具体的に使用したい。 – dstar

+0

'collect_list'を使って' explode'するのは、 'groupBy($" TruckID "、$" RoadID ")のようにする方が簡単です。 "、" Time "を" Time "と呼びます))をexplode($" datetimes "){...}'し、ロジックを '...'部分で行います。 –

答えて

0

何を試しましたか?それは非常にあなたが欲しいものを得ることはありませんが、たぶん、あなたは、ROW_NUMBERを試してみましたが、それは近いです:私はあなたがトラックや道路に基づいて次のレコードに自分自身でテーブルを結合するためにcommon table expresionを作成する必要があると思う

ROW_NUMBER() OVER (PARTITION BY TruckID, RoadID ORDER By DateTime) as TruckRoadID 

その共通テーブルのexpresionにROW_NUMBER()を使用します。

+0

ええ、今私のチームと私はラグ機能を使用しています。私たちがデータセットを削減するとSparkで正常に動作しますが、すべてを実行しようとすると失敗します。私たちは記憶を増強しました。ジョブは長く実行されますが、まだ失敗します。遅れは記憶が集中しすぎると思っています。 – dstar

+2

遅れのロジックを投稿できますか?すでに試したコードを投稿すると大きな助けになるでしょう。 –