基于条件从python中的数据库服务器提取选择性数据

2024-06-16 14:38:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下数据:

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

以上是我的数据样本,按第一列和第二列排序。这些数据位于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条记录必须被选中才能获取。latest level是每个per_id的级别中的值,其中month_id为最大值。因此,从该行开始,直到该值出现中断,都会取行

如何构造此sql查询并从python调用它?这也将有助于减少我为level_列表中的每个级别提取的数据

以df_净值表示的预期输出:

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

有人能帮我吗


Tags: 数据idsqlarea级别levelwbcper
1条回答
网友
1楼 · 发布于 2024-06-16 14:38:54

这与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

您还可以使用窗口函数进行探索

相关问题 更多 >