2013-03-23 68 views
1

我想在Informix数据库中编写sql查询以返回按年/月/周/日/小时分组的结果(我会写5个sql查询为每一个)。Informix DB-SQL Group按年,月,周,日,小时

我的方案是如下:

  • 我有两个表,竞赛表(包含竞赛名称,描述,开始日期,提交日期,审核日期,结果日期信息),其它表是提交表(包含对比赛的提交,诸如提交ID,提交者ID,提交日期..等等)。
  • 我想要实现的是通过获取按天分组的提交内容(sql返回关于每天提交多少提交内容的统计信息),或者按周,按月或按年来获取比赛进度..等等。

我很熟悉在Informix DB中编写SQL查询,但这种情况对我来说变得非常复杂,我无法弄清楚如何去做。

你能否提供一个示例查询来完成上述场景?

回答

2

如果这是你需要的不完全是,它可能会相处你一些方法,或给你一些想法:

SELECT contest_id, YEAR(submission_date) AS submission_period, COUNT(*), 
     "Y" AS sub_type 
    FROM submissions 
    GROUP BY 1, 2 
UNION ALL 
SELECT contest_id, MONTH(submission_date) AS submission_period, COUNT(*), 
     "M" AS sub_type 
    FROM submissions 
    GROUP BY 1, 2 
UNION ALL 
SELECT contest_id, DAY(submission_date) AS submission_period, COUNT(*), 
     "D" AS sub_type 
    FROM submissions 
    GROUP BY 1, 2 
ORDER BY 1, 4, 2 

但是,如果你按年看月而不是月份“或”年份周“,那么我强烈建议您考虑创建”时间维度“,例如数据仓库应用程序中使用的”时间维度“。这是每天看起来有点像这样的记录表:

Date   Year Month  Week  Quarter Day MthName 
2013-01-01 | 2013 | 2013-01 | 2013W01 | 2013Q1 | Tues | January 
2013-01-02 | 2013 | 2013-01 | 2013W01 | 2013Q1 | Wed | January 
.. 
2013-03-20 | 2013 | 2013-03 | 2013W12 | 2013Q1 | Wed | March 
.. 
2013-05-01 | 2013 | 2013-05 | 2013W18 | 2013Q2 | Wed | May 

通过加入提交日期此表,您可以通过任何列组适合您的需求。

专家提示:不要叫它们什么,我已经标记这些头,将保留字会引起你痛苦:-)

0

根据文档,informix具有执行此操作的功能。您只是不要为每个日期组件使用相同的函数。具有讽刺意味的是,要得到小时,你需要使用一个日期函数--to_char()。这个小时可能有适当的面具。如果不是,你将不得不使用一个子字符串。对于日期组件,您可以使用时间组件year(),month()以及day()或weekday()。本周你可能不太走运。

看到这些参考页:

编辑

下面是一个简单的例子,使用一年福nction。

select year(resultdate) resultyear, count(*) results 
from etc 
group by year(resultdate) 
+0

感谢您的回答,但是这并没有回答这个问题,我的问题是如何通过使用比赛日期按小时/天/周/月/年划分比赛的sql语句编写一个组。 – 2013-03-23 17:35:56

0

当我运行此查询,我得到一个错误: “错误:发生语法错误(状态:37000,本机代码:FFFFFF37)“ 您必须将组编号更改为列编号,即

select year(resultdate)as resultYear,count(*)as resultCount from caa44340 group by 1

为它正常运行!