【问题标题】:select records from a table for each different date in single iteration of SQL query在 SQL 查询的单次迭代中为每个不同日期从表中选择记录
【发布时间】:2015-01-30 08:45:58
【问题描述】:

抱歉,问题陈述含糊不清,也许我无法以正确的方式构建它,因此无法从互联网获得太多帮助。

我的基本意图是从一个表中选择两列,其中该表已根据日期进行分区,并且具有大量记录。

目的是为从 1 月 1 日到 11 月 30 日的每个日期选择记录,不能使用 date between 语句来完成,我需要在 for 循环的迭代中分别输入每个日期。

任何人都可以帮助编写一个虚拟 sql 查询吗?

谢谢,

【问题讨论】:

  • 作为伪代码,我想要 for (date in DATES)SELECT col1,col2 from TABLE where datecol 是日期。谢谢!
  • 我知道,但是数据表太大了!我必须访问一个查询的分区,这基本上是一个查询优化问题。
  • 我不认为你会通过在“GROUP BY”上使用 forloop 来赢得任何东西,因为 sqldatabase 仍然需要查看抛出孔表。
  • 为什么需要为每个日期运行一个查询?运行单个查询时是否收到假脱机错误?您需要处理给定日期的所有行还是只处理一些行?

标签: sql for-loop teradata


【解决方案1】:

你可以使用任何脚本语言来迭代每一天来实现。 下面是一个示例(未经测试的代码)

import pyodbc

conn = pyodbc.connect(DSN='dsnname',autocommit=True,ansi=True)
cur = conn.cursor()
sql = "INSERT INTO tgt_table SELECT col1,col2 FROM src_table WHERE partitioned_date_column = date '2014-01-01' + INTERVAL '%d' DAY"

for i in range(1,30):
    cur.execute(sql % i)

【讨论】:

  • 谢谢你,我不知道你是谁,但你帮了我很大的忙,你让我很开心,非常感谢!
【解决方案2】:

假设您使用 oracle,此虚拟选择应该为您提供加入日期列表

select to_date('01.01.2014','dd.mm.yyyy') + level - 1
from dual
connect by level -1 <= to_date('30.11.2014','dd.mm.yyyy') - to_date('01.01.2014','dd.mm.yyyy')    

【讨论】:

  • 非常好,但是对于每个这样的日期,我想要表中的记录,例如元组 col1,col2,datecol,其中 datecol 是迭代器中的那个日期。我必须在 teradata 上编写基本的 sql 查询
【解决方案3】:

我不知道你的桌子长什么样,但你有没有尝试过这样的事情:

WHERE {yourRow} &gt; X GROUP BY date

MySQL Query GROUP BY day / month / year

希望这可以帮助你:-)

SELECT col1, col2 FROM {table} WHERE datecol between '2000-01-01' and DATE_ADD('2000-01-31',INTERVAL 1 DAY)

SELECT col1, col2, FROM {table} GROUP BY DAY(datecol)

【讨论】:

  • 我知道,但是数据表太大了!我必须访问一个查询的分区,这基本上是一个查询优化问题。
  • 好的,所以这个间隔1天,它是否只访问数据表的一个分区,如,它不应该跨越几个数据分区的查询。
  • 我还没有阅读有关此主题的所有文档,但我认为第一个示例是最快的,因为它首先查看日期,如果日期超出范围,则中断,否则会选择。我认为您将需要自己测试什么是最快的方法。 (WHERE vs GROUP BY)请让我知道你的基准在说什么。
猜你喜欢
  • 2021-12-03
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
  • 2012-12-10
  • 1970-01-01
  • 2015-02-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多