【问题标题】:Can repeating query be saved?可以保存重复查询吗?
【发布时间】:2022-01-29 11:06:41
【问题描述】:

在我的 Python / Sqlite 程序中,我正在运行这样的查询

q=SELECT COUNT(1) FROM (SELECT a1 FROM tableX WHERE freq>=1.6 AND a3='n' AND a4='y' AND a5='q' GROUP BY a1)
q=SELECT COUNT(1) FROM (SELECT a2 FROM tableX WHERE freq>=1.6 AND a3='n' AND a4='y' AND a5='q' GROUP BY a2)
q=SELECT COUNT(1) FROM (SELECT a9 FROM tableX WHERE freq>=1.6 AND a3='n' AND a4='y' AND a5='q' GROUP BY a9)

所以“基本”查询是一样的,Sqlite 收集的行是一样的,但是由于分组不同,我必须多次运行相同的查询。

我想知道是否有一种方法可以更有效地实现相同的输出,即。只运行一次查询?

【问题讨论】:

  • 你的 q 变量是什么类型的?是字符串吗?
  • 您可以创建内部查询的 VIEW 和视图上的 GROUP BY。

标签: python sqlite group-by count distinct


【解决方案1】:

在您的每个子查询中,虽然您使用的是 GROUP BY,但您并没有进行任何聚合,所以我认为您想要的只是计算每个案例的不同 aX

您可以在单个查询中执行此操作,并将所有计数器作为不同的列返回:

SELECT COUNT(DISTINCT a1) AS q1,
       COUNT(DISTINCT a2) AS q2,
       COUNT(DISTINCT a9) AS q9
FROM tableX
WHERE freq >= 1.6 AND a3 = 'n' AND a4 = 'y' AND a5 = 'q';

【讨论】:

  • 好吧,我在做聚合。 a1 返回的值类似于 "w"、"r"、"r"、"w"、"t" ,然后我按这些值分组,并计算存在多少个不同的选项。
  • @Wartin 您没有在子查询中进行任何聚合。获得子查询的结果后应用 COUNT()。您的每个子查询都相当于:SELECT DISTINCT a1 FROM tableX WHERE freq>=1.6 AND a3='n' AND a4='y' AND a5='q',因此您不需要 GROUP BY。
  • 你是对的。我刚试过你的建议,它有效。谢谢你。我还没有弄清楚它是如何工作的,但我会更多地研究它。
【解决方案2】:

如果您的 q 变量是要执行的查询字符串,您可以使用循环执行您想要的操作:

for i in [1, 2, 9]:
    q=f"SELECT COUNT(1) FROM (SELECT a{i} FROM tableX WHERE freq>=1.6 AND a3='n' AND a4='y' AND a5='q' GROUP BY a{i})"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-30
    • 2018-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多