python - 使用来自多个表的随机行的 SELECT UNION 查询

标签 python sql pandas sqlite

我有不同的表:A、B、C ... 我想从每个表中选择一定数量的行并进行合并

我使用了这个查询(给定的数字 = 100):

sql_query = ''' SELECT * FROM A ORDER BY RANDOM() LIMIT 100 
             UNION SELECT * FROM B ORDER BY RANDOM() LIMIT 100 '''

但是当我尝试读取 DataFrame 时:

df=pd.read_sql(sql_query, con)

我有一个错误:

DatabaseError: Execution failed on sql : LIMIT clause should come after UNION not before

如果我在 UNION 之后使用 LIMIT 子句,它只会返回给定的行数,但我不知道从每个表中提取了多少行。

示例:如果我想要 A 中的 100 行和 B 中的 100 行,在 UNION 之后使用 LIMIT 200 子句,我将有 200 行,但我不知道从 A 和 B 中提取了多少行

谢谢你的帮助,

最佳答案

考虑使用派生表(FROM 子句中的子查询)来设置LIMIT。您可能还希望 UNION ALL 保留重复项,否则每个表收到的记录可能少于 100 条。

sql_query = ''' SELECT * 
                FROM (SELECT * FROM A ORDER BY RANDOM() LIMIT 100)
                UNION ALL
                SELECT * 
                FROM (SELECT * FROM B ORDER BY RANDOM() LIMIT 100)'''

或者,迭代读取每个表并连接到最终数据帧:

sql_query = 'SELECT * FROM {} ORDER BY RANDOM() LIMIT 100'

df_list = [pd.read_sql(sql_query.format(t), con) for t in ['A', 'B']]

df = pd.concat(df_list, ignore_index=True)

关于python - 使用来自多个表的随机行的 SELECT UNION 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48209383/

相关文章:

python - 数据帧上的逐元素三元条件运算

python - 过滤器在Elasticsearch中不起作用

python - python中的分区字符串并获取冒号后最后一段的值

python - 在Python中使用弱引用的正确方法

sql - 如何使用 JDBC 调用带有命名参数的 Sybase 存储过程

sql - 在 SELECT 语句中调用函数时的性能

Python:调用继承的父类方法失败

python - 绘制带宽上的标准差与平均值的比率

php - 改进查询运行时间(加载页面需要 20 秒以上)

python - 数字作为 statsmodels.formula.api 无法识别的变量名称