2016-04-29 59 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问题,除非你一般不知道如何从python执行SQL查询......但这是一个不同的问题(有很多信息[在互联网上]( 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 - 你有DEPDEST不同的值,则只需添加那些在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 documentationtime列:

以下关键字可以在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 

(...)只是重复了其他列