2016-04-29 23 views
0

でSQLテーブルのMIN MAXを抽出します。は、私は、以下の情報を持つデシベルを持っているのpython

+----+------+-----+-----+------+------+-----------+  
| id | time | lat | lon | dep | dest | reg  |  
+----+------+-----+-----+------+------+-----------+  
| a | 1 | 10 | 20 | home | work | alpha  |  
| a | 6 | 11 | 21 | home | work | alpha  |  
| a | 11 | 12 | 22 | home | work | alpha  |  
| b | 2 | 70 | 80 | home | cine | beta  |  
| b | 8 | 70 | 85 | home | cine | beta  |  
| b | 13 | 70 | 90 | home | cine | beta  |  
+----+------+-----+-----+------+------+-----------+  

には、以下の情報を抽出することが可能です:

+----+------+------+----------+----------+----------+----------+------+------+--------+  
| id | tmin | tmax | lat_tmin | lon_tmin | lat_tmax | lon_tmax | dep | dest | reg |  
+----+------+------+----------+----------+----------+----------+------+------+--------+  
| a | 1 | 11 |  10 |  20 |  12 |  22 | home | work | alpha |  
| b | 2 | 13 |  70 |  80 |  70 |  90 | home | cine | beta |  
+----+------+------+----------+----------+----------+----------+------+------+--------+ 

場合DEP & destが変化し、どのような - どのようにそれらを選択するだろうか?

Thks

+1

私の最初の質問は次のようになります。どのように – tog

+0

* :-)あなたの形式のテーブルを行う「DEP&destが何を変えた場合は、」*:あなたはその場合の結果を持っているために何をしたいですか?その情報をあなたの質問に追加できますか?注:一般的に、PythonからSQLクエリを実行する方法がわからない場合を除いて、これをPythonの質問としてタグ付けする必要はないと思います...しかし、これは別の質問です(インターネット上のhttp://pymssql.org/en/latest/pymssql_examples.html))。 – trincot

答えて

1

のために繰り返します。

SELECT  t0.id, 
      t0.time as  tmin, t1.time as  tmax, 
      t0.lat as lat_tmin, t1.lat as lat_tmax, 
      t0.lon as lon_tmin, t1.lon as lon_tmax, 
      t0.dep, 
      t0.dest, 
      t0.reg 
FROM  (SELECT *, 
        row_number() over (partition by id order by time asc) as rn 
      FROM t) AS t0 
INNER JOIN (SELECT *, 
        row_number() over (partition by id order by time desc) as rn 
      FROM t) AS t1 
     ON t0.id = t1.id 
WHERE  t0.rn = 1 
     AND t1.rn = 1 

これからのデータを返します。最初の行と最後の行のそれぞれ、 id、時間でソートすると。 DEPDESTREGため

値のみ(ID当たり)最初の行から取られます。

あなたがのために別の行をも持つようにしたい場合 - 同じIDのために - あなたはDEPまたはDESTの異なる値を持って、そしてちょうどpartition by節のものを追加します。すべては、あなたが、その場合には期待していた出力に依存します:

SELECT  t0.id, 
      t0.time as  tmin, t1.time as  tmax, 
      t0.lat as lat_tmin, t1.lat as lat_tmax, 
      t0.lon as lon_tmin, t1.lon as lon_tmax, 
      t0.dep, 
      t0.dest, 
      t0.reg   
FROM  (SELECT *, 
        row_number() over (partition by id, dep, dest, reg 
             order by time asc) as rn 
      FROM t) AS t0 
INNER JOIN (SELECT *, 
        row_number() over (partition by id, dep, dest, reg 
             order by time desc) as rn 
      FROM t) AS t1 
     ON t0.id = t1.id 
WHERE  t0.rn = 1 
     AND t1.rn = 1 

ためthis remark in the documentationの列timeに別の名前を使用することを検討してください:

次のキーワードは、SQL Serverの将来のリリースで予約することができ新しい機能が実装されているためです。これらの単語を識別子として使用することは避けてください。

... TIME ... 
+0

ありがとう、これは素晴らしい動作しています。 – tog

+0

ようこそ。 – trincot

0
select min(t.time) as tmin, max(t.time) as tmax, (...) from table_name t group by t.dest 

(...)ちょうどあなたがそのためにウィンドウ関数を使用することができ、他の列

関連する問題