优化" group by"并保持最大或最小 - MySQL / Python

时间:2017-01-25 03:22:31

标签: python mysql pandas group-by

Intel(R) Core(TM) i5-6300U CPU @ 2.40GHz
8,00Gb RAM
Windows 7 Enterprise SP1 - 64-bit
MySQL Workbench Community (GPL) for Windows version 6.3.8 CE build 1228 (64 bit)
Python v3.5 (PyCharm)
PyMySQL v0.7.9
Pandas v0.18.1

嘿伙计们,

我有一张桌子"测试"就像有大约350万行的那些,我想得到使用最大或最小日期作为标准对数字进行分组的行。 结果转到python中的DataFrame结构。

id  num  name  dates
'1'  '1'  'A'  '2017-01-02'
'2'  '1'  'B'  '2016-01-02'
'3'  '2'  'C'  '2016-01-01'
'4'  '2'  'C'  '2017-10-01'
'5'  '3'  'C'  '2012-10-01'
'6'  '3'  'C'  '2011-10-01'

结果 - min 条件:

id   num  name  dates
'2'  '1'  'B'  '2016-01-02'
'3'  '2'  'C'  '2016-01-01'
'6'  '3'  'C'  '2011-10-01'

以下是查询:

SELECT t.*
  FROM (
    SELECT num, min(dates) AS max_dates
    FROM test
    GROUP BY num
    ) AS m
INNER JOIN test AS t
ON t.num = m.num
AND t.dates= m.max_dates

目前大约需要190秒才能在python中运行:

import pymysql as db
import pandas as pd

connection=db.connect('localhost', user=user_db,passwd=pass,db='project', use_unicode=True, charset="utf8")

test = pd.read_sql_query(QUERY, connection)

有没有办法在python中优化此查询和/或导入数据框?

作为一般问题:将表从MySQL导入到Python的任何其他好的(快速)实践?

谢谢!

1 个答案:

答案 0 :(得分:0)

我建议像这样编写查询:

SELECT t.*
FROM test t
WHERE t.date = (SELECT MAX(dates)  -- or MIN()
                FROM test t2
                WHERE t2.num = t.num
               );

然后,您需要test(num, dates)test(dates)上的索引。