SQL查询为4个数据库列的值的每个不同组合创建单独的数据框?

时间:2019-07-09 17:50:25

标签: python sql oracle

如何使用Python的Oracle数据库表中的4列的所有可能组合创建多个数据框?

如何编写这样的SQL查询,其中所有提取的记录都将加载到我的数据框中?我正在使用Oracle12c

可以说我的列名是“ A”,“ B”,“ C”,“ D”。我的数据库表中其不同值的数量分别为4、3、2、6。在这里,总的组合可能是4 * 3 * 2 * 6 =144。所以基本上我需要144个数据帧。

现在,我想在一个数据帧中加载从这些值的一种组合(比如说A1-B1-C1-D1)获取的所有记录,从其他组合的这些值(A1-B1-C1-D2)获取的所有记录在下一个数据帧中,依此类推。

我对这件事很陌生,所以被困在这里。

3 个答案:

答案 0 :(得分:1)

您需要SELECT每组值并将CROSS JOIN在一起。例如,

SELECT     a, b, c, d
FROM       ( SELECT a FROM my_table ) xa
CROSS JOIN ( SELECT b FROM my_table ) xb
CROSS JOIN ( SELECT c FROM my_table ) xc
CROSS JOIN ( SELECT d FROM my_table ) xd

您可能希望修改子查询以选择DISTINCT个值。

这将为您提供一个结果集,其中包含四列中所有可能的值组合。

  

现在,我想在一个数据帧中加载从这些值的一种组合(比如说A1-B1-C1-D1)获取的所有记录,从其他组合的这些值(A1-B1-C1-D2)获取的所有记录在下一个数据帧中,依此类推。

我不知道什么是“数据框”,所以我无法帮助您完成这一部分。

答案 1 :(得分:1)

您的查询是否最终将原样下载整个表?如果找到A,B,C,D列的每种不同组合,然后将表加入这些组合,那么您只需返回原始表即可。

您是否可以创建一个新列来连接A,B,C,D的值?

select
  A || '-' || B || '-' || C || '-' || D as ABCD
, A
, B
, C
, D
from my_table

输出为:

ABCD           A    B    C    D
A1-B1-C1-D1    A1   B1   C1   D1
A1-B1-C1-D2    A1   B1   C1   D2

将其放入数据框,如下所示:

import pandas as pd
query = """
        select
          A || '-' || B || '-' || C || '-' || D as ABCD
          , A
          , B
          , C
          , D
        from my_table
        """
df = pd.read_sql(sql = query, con = conn)

现在,您有了一个带有新列ABCD的数据框,可用于对所有A,B,C,D方案进行分组。我强烈建议不要将其分解为单独的数据框。我想知道为什么要这么做吗?

如果要引用特定场景,则只需执行以下操作:

df[df['ABCD'] == 'A1-B1-C1-D1']

答案 2 :(得分:1)

假设Python的pandas库,请考虑按原样加载 entire 查询,然后运行groupby来构建144个数据帧的列表或字典。答案:

  

如何从4列的所有可能组合中创建多个数据框...?

最好将许多相似的结构化对象存储在一个容器中,而不是将144个单独的对象淹没您的全局环境。如果存储在列表或字典中,则不会丢失数据框的功能。

sql_df = pd.read_sql("""SQL Query""", conn)

# DICTIONARY COMPREHENSION
df_dict = {i:g for i,g in sql_df.groupby(['A', 'B', 'C', 'D']) }

# REFERENCE INDIVIDUAL DFs WITH TUPLE KEYS
df_dict[(A1, B1, C1, D1)].head()

df_dict[(A1, B1, C1, D2)].describe()

df_dict[(A1, B1, C1, D3)].tail()

为避免元组键,请使用下划线定界符将值映射到单个字符串键:

df_dict = {"_".join(map(str, i)):g for i,g in sql_df.groupby(['A', 'B', 'C', 'D']) }

# REFERENCE INDIVIDUAL DFs WITH TUPLE KEYS
df_dict['A1_B1_C1_D1'].head()

df_dict['A1_B1_C1_D2'].describe()

df_dict['A1_B1_C1_D3'].tail()