Oracle 在小组中获得时间-甲骨文-有什么不对

Oracle 在小组中获得时间-甲骨文-有什么不对,oracle,Oracle,这个查询有什么问题。 我需要24小时内的所有时间来计算每小时的点击率。 我想在0-24岁时做一个案例,但我不能做第一件工作 SELECT ( CASE WHEN ( CAST(TO_CHAR(dg_user_acess.dt_user_acess, 'HH24') >= '00') AND CAST(TO_CHAR(dg_user_acess.dt_user_acess, 'HH24') < '01')

这个查询有什么问题。 我需要24小时内的所有时间来计算每小时的点击率。 我想在0-24岁时做一个案例,但我不能做第一件工作

SELECT
    (
    CASE WHEN (
           CAST(TO_CHAR(dg_user_acess.dt_user_acess, 'HH24') >= '00')
         AND
          CAST(TO_CHAR(dg_user_acess.dt_user_acess, 'HH24') < '01')
         )
        THEN ('00:00 as 01:00')
        ELSE '0' END
    ) as hour,        
    count(*)
FROM dg_user_acess
GROUP by hour
结果我希望这样的东西不写的情况下,当所有schedulesin查询不污染代码

'00:00 as 01:00' 0
'01:00 as 02:00' 0
'02:00 as 03:00' 0
'03:00 as 04:00' 0
'04:00 as 05:00' 0
'05:00 as 06:00' 0
'06:00 as 07:00' 0
'07:00 as 08:00' 0
'08:00 as 09:00' 3
'09:00 as 10:00' 1
'10:00 as 11:00' 1
'11:00 as 12:00' 0
'12:00 as 13:00' 0 
'13:00 as 14:00' 0 
'14:00 as 15:00' 0 
'15:00 as 16:00' 0 
'16:00 as 17:00' 0 
'17:00 as 18:00' 0 
'18:00 as 19:00' 0 
'19:00 as 20:00' 0 
'20:00 as 21:00' 0 
'21:00 as 22:00' 0 
'22:00 as 23:00' 0 
'23:00 as 23:59' 0 
我得到了一些结果,改变了组和情况,并删除了演员阵容

我不知道这是否是最好的方法,但它奏效了

此查询有什么问题[?]

您的查询有许多或多或少严重的问题-没有特定的顺序:

CAST的正确语法是CASTvalue AS type 您使用hour作为列名,但它是保留字 比较字符串时,可能需要比较的是数字 您似乎期望得到一个密集的结果集,但由于您不使用联接,结果集的行数不可能比原始表的行数多,事实上,在分组时,行数可能会减少 考虑到你的需要,你可能错过了这个功能。为了提取一小时内的所有点击量,您可以这样写:

SELECT
  EXTRACT(HOUR FROM dg_user_acess.dt_user_acess) as "hour"        
FROM dg_user_acess
由于需要对它们进行计数,并且由于不能在GROUPBY子句中使用别名,因此可以使用子查询。不要太担心这一点:Oracle足够聪明,可以优化此类请求:

SELECT "hour", count(*) "cnt"
FROM (
    SELECT
      EXTRACT(HOUR FROM dg_user_acess.dt_user_acess) as "hour"        
    FROM dg_user_acess
) V
GROUP BY "hour";
最后,由于您需要密集输出,即:所有小时数都在0-23范围内,我的选择是在生成的表上使用联接:

SELECT "hour", NVL("cnt",0) "cnt"
FROM (
    SELECT LEVEL "hour" FROM DUAL
    CONNECT BY LEVEL < 24
) CLOCK
LEFT JOIN (
    SELECT "hour", count(*) "cnt"
    FROM (
        SELECT
          EXTRACT(HOUR FROM dg_user_acess.dt_user_acess) as "hour"        
        FROM dg_user_acess
    ) V
    GROUP BY "hour"
) G
USING ("hour")
ORDER BY "hour";
所有这些都会导致相当复杂的嵌套查询。但这样做的好处是,正如您所看到的那样,可以轻松地增量编写。既然我展示了基本的构建模块,也许我们可以做得更好。也许:

SELECT CLOCK."hour", COUNT(dg_user_acess.dt_user_acess) "cnt"
FROM (
    SELECT LEVEL "hour" FROM DUAL
    CONNECT BY LEVEL < 24
) CLOCK
LEFT JOIN dg_user_acess
ON CLOCK."hour" = EXTRACT(HOUR FROM dg_user_acess.dt_user_acess)
GROUP BY CLOCK."hour"
ORDER BY CLOCK."hour";

根据您的模式和数据,这可能会比以前的版本更好,也可能不会更好。您可以花点时间在

上试验所有这些查询,当您运行这些查询时会发生什么?你有什么错误?您试图转换到什么数据类型,以及哪个部分-您需要转换以及to_字符吗?您的括号也不平衡。请发布一些示例数据和预期结果;您的查询被严重破坏,无法帮助解释问题。现在可能变得更清楚了,转换将逃避错误00904。00000-%s:无效标识符,我现在看到出现此错误是因为小组成员未正确提问,很抱歉,我将尝试更好地了解如何使用论坛来提高我的参与度以进行回答,我现在不会测试它,因为我发布的答案运行良好。当我有空的时候,我会测试你的答案
SELECT "hour", count(*) "cnt"
FROM (
    SELECT
      EXTRACT(HOUR FROM dg_user_acess.dt_user_acess) as "hour"        
    FROM dg_user_acess
) V
GROUP BY "hour";
SELECT "hour", NVL("cnt",0) "cnt"
FROM (
    SELECT LEVEL "hour" FROM DUAL
    CONNECT BY LEVEL < 24
) CLOCK
LEFT JOIN (
    SELECT "hour", count(*) "cnt"
    FROM (
        SELECT
          EXTRACT(HOUR FROM dg_user_acess.dt_user_acess) as "hour"        
        FROM dg_user_acess
    ) V
    GROUP BY "hour"
) G
USING ("hour")
ORDER BY "hour";
SELECT CLOCK."hour", COUNT(dg_user_acess.dt_user_acess) "cnt"
FROM (
    SELECT LEVEL "hour" FROM DUAL
    CONNECT BY LEVEL < 24
) CLOCK
LEFT JOIN dg_user_acess
ON CLOCK."hour" = EXTRACT(HOUR FROM dg_user_acess.dt_user_acess)
GROUP BY CLOCK."hour"
ORDER BY CLOCK."hour";