получение выборочных данных с сервера базы данных в Python в зависимости от условий - PullRequest
0 голосов
/ 14 мая 2018

У меня есть следующие данные:

per_id      month_id    area_grp    area_hrs    level
754         201803      WNY         19.93       OVue
754         201802      MT          0.52        OVue
754         201802      WBS         0.34        OVue
754         201801      WYW         33.04       OVue
754         201801      VC          16.62       OVue
754         201801      PX          3.05        OVue
754         201712      RZN         5.05        OVue
754         201711      WYW         17.85       OVue
754         201711      NLN         0.8         OVue
754         201711      DJr         45.67       OVue
754         201711      TC          11.81       OVue
754         201710      MBN         1.61        OVue
754         201709      WAD         4.72        OVue
754         201709      DJr         23.82       OVue

**147           201803      WBC         13.44       OVue
147         201803      WBS         4.17        OVue
147         201803      WYW         1.80        OVue
147         201802      VD          5.14        OVue
147         201802      LNY         0.05        OVue
147         201801      LEIF        6.94        OVue
147         201801      WBC         25.35       OVue
147         201801      VD          8.53        OVue**
147         201712      MVR         7.17        OSver
147         201711      WDA         9.89        OSver
147         201711      YS          1.65        OSver
147         201711      N1T         3.02        OSver
147         201710      LEIF        1.83        OSver
147         201710      Hi          3.15        OVue
147         201710      TLD         1.43        OVue
147         201710      WBC         21.56       OSver
147         201710      NTT         2.88        OSver
147         201710      WBS         5.64        OSver
147         201710      LNY         2.67        OSver
147         201710      BRV         2.91        OSver
147         201710      N1T         3.78        OSver

Выше приведен пример моих данных, отсортированных по 1-му и столбцам здесь.Эти данные хранятся в таблице в postgresql, и я создаю запрос на основе уровня параметра.

level_list = ['OSver','Ovue']

for i in range(0,len(level_list)):
    sql_per_hours = str("""select * from table_name where level = %s ;""") \
                        %("'"+''.join(level_list[i]) + "'") 
    df_net = pd.read_sql(sql_per_hours,cnxn)

Теперь для per_id 754, поскольку он работал на одном уровне, должны быть получены все записи для него.Но для людей, которые работали на более чем 1 уровне.Только последняя информация уровня должна быть взята.Таким образом, для per_id 147 должны быть выбраны только первые 8 записей.последний уровень - это значение в уровне для каждого per_id, где month_id является макс.Таким образом, из этой строки, до тех пор, пока не произойдет перерыв в значении, будут взяты строки.

Как я могу построить этот SQL-запрос и вызвать его из Python?Это также поможет мне уменьшить количество данных, которые я получаю для каждого уровня в level_list.

Ожидаемый вывод в виде df_net:

per_id      month_id    area_grp    area_hrs    level
754         201803      WNY         19.93       OVue
754         201802      MT          0.52        OVue
754         201802      WBS         0.34        OVue
754         201801      WYW         33.04       OVue
754         201801      VC          16.62       OVue
754         201801      PX          3.05        OVue
754         201712      RZN         5.05        OVue
754         201711      WYW         17.85       OVue
754         201711      NLN         0.8         OVue
754         201711      DJr         45.67       OVue
754         201711      TC          11.81       OVue
754         201710      MBN         1.61        OVue
754         201709      WAD         4.72        OVue
754         201709      DJr         23.82       OVue
147         201803      WBC         13.44       OVue
147         201803      WBS         4.17        OVue
147         201803      WYW         1.80        OVue
147         201802      VD          5.14        OVue
147         201802      LNY         0.05        OVue
147         201801      LEIF        6.94        OVue
147         201801      WBC         25.35       OVue
147         201801      VD          8.53        OVue

Может кто-нибудь помочь мне с этим?

1 Ответ

0 голосов
/ 14 мая 2018

Это больше связано с SQL, чем с python. Сначала получите последний уровень, соответствующий каждому per_id и используйте эту информацию, чтобы получить необходимые строки.

select table_name.* -- get all records for last level
from 
    table_name
left join
    (select distinct per_id, level from -- get latest level
        table_name tn
    left join
        (select
            per_id,
            max(month_id) as latest_month -- get latest month
        from
            table_name 
        group by per_id) sub1
    on 
        tn.per_id = sub1.per_id 
        and tn.month_id = sub1.latest_month)sub2
on 
    table_name.per_id = sub2.per_id
    and table_name.level = sub2.level

Вы также можете исследовать с помощью оконных функций.

...