2016-04-29 5 views
0

У меня есть БД со следующей информацией:Extract MIN MAX таблицы SQL в питоне

+----+------+-----+-----+------+------+-----------+  
| 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 |  
+----+------+------+----------+----------+----------+----------+------+------+--------+ 

что если отд & Dest были изменяющимися - Как бы выбрать их?

Thks

+1

мой первый вопрос должен быть: как вам таблицы формата :-) – tog

+0

* «что, если отд & Dest были различными» *: то, что вы хотите иметь в результате в этом случае? Можете ли вы добавить эту информацию на свой вопрос? NB: Я не думаю, что вы должны пометить это как вопрос 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, при сортировке по id, время.

Значение для отда, Dest и рег взято из первой строки (за ID) только.

Если вы хотите, чтобы также иметь отдельные строки для того, когда - по той же идентификатор - у вас есть различные значения отд или 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 

Пожалуйста, обратите внимание, используя другое имя для столбца time из-за this remark in the documentation:

Следующие ключевые слова могут быть защищены в будущих версиях 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 

(...) просто повторить для других столбцов

Смежные вопросы