Oracle / SQL - 按日期按行动对项目进行分组

时间:2011-05-20 03:14:58

标签: sql group-by oracle9i

大家好我有一个'widget'表,其中包含以下列:widget,action,timestamp_。我们想要做的是在特定日期之间拉出每天被拒绝多次的所有小部件。所以这是一个示例表

widget      action      timestamp_
-------------------------------------------
type1       reject      2011-05-10 08:00:00
type1       reject      2011-05-10 09:00:00
type1       reject      2011-05-10 09:30:00
type2       reject      2011-05-11 09:30:00
type3       reject      2011-05-11 09:30:00
type1       reject      2011-05-11 09:30:00
type1       reject      2011-05-11 09:30:00
type2       reject      2011-05-12 10:30:00
type2       reject      2011-05-12 12:30:00
type3       reject      2011-05-12 12:30:00

所以我期待以这两种方式之一看到结果......

在日期x和y之间,有两个小部件在一天内被多次拒绝

这会看到type1在一天内被拒绝了多次,因为type2因此计数为:2

OR

显示每个小部件及其被拒绝的日期多次以及多少次。实施例..

widget      date            count
---------------------------------
type1       2011-05-10      3
type1       2011-05-11      2
type2       2011-05-12      2

这可能是首选输出......但是如何?

提前致谢!

2 个答案:

答案 0 :(得分:12)

这会给你输出:

SELECT Widget, to_char(timestamp_,'YYYY-MM-DD'), Count(Widget)
FROM Widget
WHERE timestamp_ BETWEEN to_date('YYYY-MM-DD HH24:MI:SS','%date1%') AND to_date('YYYY-MM-DD HH24:MI:SS','%date2%')
AND action LIKE 'reject'
GROUP BY Widget, to_char(timestamp_,'YYYY-MM-DD')
HAVING Count(Widget) > 1;

当然,您需要替换日期变量。

答案 1 :(得分:0)

尝试下面的一个,你会得到你想要的: -

  Select widget,convert(varchar,[timestp],102) As Date,COUNT(timestp) as Count
  From MTest
  group by widget,[action],convert(varchar,[timestp],102)
  having COUNT(timestp)>1