如何从Oracle中的表中仅选择一个唯一的date_time记录

时间:2016-10-10 06:55:43

标签: sql oracle jsp

SELECT date_time,
       case when COUNT(*) >= 1 then 1 else 0 end CNT
FROM table
WHERE bid='BD11' AND
      date_time BETWEEN TO_DATE ('2015/08/01', 'yyyy/mm/dd') AND
                        TO_DATE ('2016/08/11', 'yyyy/mm/dd')
GROUP BY date_time

...这是我的查询 date_time计数

2015-08-01 1
2015-08-01  1
2015-08-01  1
2015-08-01  1
2015-08-01  1
2015-08-01  1
2015-08-02   1
2015-08-02  1
2015-08-02   1
2015-08-03  1
2015-08-03 1
2015-08-03  1
它打印出来就像是 2015-08-01 1 2015-08-02 1 2015-08-03 1

4 个答案:

答案 0 :(得分:1)

添加' distinct'关键字到date_time在查询的选择部分

答案 1 :(得分:0)

使用不同或唯一。

SELECT trunc(date_time)
       ,count(*)
FROM table
WHERE bid='BD11' AND
      date_time BETWEEN TO_DATE ('2015/08/01', 'yyyy/mm/dd') AND
                        TO_DATE ('2016/08/11', 'yyyy/mm/dd')
group by trunc(date_time)

答案 2 :(得分:0)

请查看您的查询中的一些漏洞。

首先,如果您希望每个日期的单个记录在唯一键上添加distinct或group by。 其次,您的case将始终评估为1。那么你为什么写它呢?这对我没有任何意义。

SELECT trunc(date_time),
           case when COUNT(*) >= 1 then 1 else 0 end CNT
    FROM table
    WHERE bid='BD11' AND
          date_time BETWEEN TO_DATE ('2015/08/01', 'yyyy/mm/dd') AND
                            TO_DATE ('2016/08/11', 'yyyy/mm/dd')
   GROUP BY trunc(date_time);

参见演示:

 with t_moored_buoy_rtqc (date_time, COUNT) AS ( /*****This is yoour table data***/
                                                select TO_DATE ('2015/08/01 10:13:13', 'yyyy/mm/dd HH:MI:SS'),'1'  from dual                              
                                                union all 
                                                select TO_DATE ('2015/08/01 10:13:15', 'yyyy/mm/dd HH:MI:SS'),'1' from dual 
                                                union all 
                                                select TO_DATE ('2015/09/01 10:13:13', 'yyyy/mm/dd HH:MI:SS'),'1' from dual  ) 
select  trunc(date_time), case when COUNT(*) >= 1 then 1 else 0 end CNT 
from t_moored_buoy_rtqc 
group by trunc(date_time)

答案 3 :(得分:0)

如果您的date_time列实际上不包含时间,则group by和distinct版本应该正常工作。您能否确认仅在DB中存储日期,并且您正在使用的客户端未屏蔽时间部分?

[编辑]因为你也想要那个数:

select trunc(date_time) date_time,
       case when count(*) > 1 then 1 else 0 end cnt
  from table
 where bid = 'BD11'
   and date_time between to_date('2015/08/01', 'yyyy/mm/dd') and
                         to_date('2016/08/11', 'yyyy/mm/dd')
 group by trunc(date_time);

我不明白你要用这个数量来完成什么 - 它总会返回1.请注意,我将“> =”更改为“>” - 因此,如果日期重复多次,则上述查询将返回1,如果只有一行具有日期,则返回0。

此查询将返回日期和时间:

select to_char(date_time, 'yyyy/mm/dd hh:mi:ss am') date_time
  from table
 where bid = 'BD11'
   and date_time between to_date('2015/08/01', 'yyyy/mm/dd') and
                         to_date('2015/08/11', 'yyyy/mm/dd');

另外,您想要2016/08/11的数据吗?你写它的方式你不会得到当天的数据,除非它正好是午夜。如果您当天需要所有内容,请使用“> =”和“<”:

   and date_time >= to_date('2015/08/01', 'yyyy/mm/dd')
   and date_time < to_date('2015/08/12', 'yyyy/mm/dd')