【问题标题】:Getting duplicate records after using WITH AS使用 WITH AS 后获取重复记录
【发布时间】:2019-08-06 06:08:25
【问题描述】:

我有三个选择查询,它们按小时对月份最后一天(当前、当前-1、当前-2)的记录进行计数。

我正在尝试使其三个输出并排出现的单个查询。

我使用with as 来完成这项工作。

问题是获得重复记录(近 2k 条记录),其中预期的最大行数为 24(因为每天 24 小时)。

查询:

with curr as 
(
  Select
    last_day(add_months(trunc(sysdate, 'mm'), 0)),
    TO_CHAR(created_date, 'HH24') as "Time",
    count(1) as "Count"
  from
    table1
  where cretd_date >= trunc(last_day(add_months(trunc(sysdate, 'mm'), 0)))
  group by
    TO_CHAR(created_date, 'HH24'),
    last_day(add_months(trunc(sysdate, 'mm'), 0))
  order by
    TO_CHAR(cretd_date, 'HH24')
),
curr_1 as 
(
  Select
    last_day(add_months(trunc(sysdate, 'mm'), -1)),
    TO_CHAR(created_date, 'HH24') as "Time",
    count(1) as "Count"
  from
    table1
  where cretd_date >= trunc(last_day(add_months(trunc(sysdate, 'mm'), -1)))
  group by
    TO_CHAR(created_date, 'HH24'),
    last_day(add_months(trunc(sysdate, 'mm'), -1))
  order by
    TO_CHAR(cretd_date, 'HH24')
),
curr_2 as
(
  Select
    last_day(add_months(trunc(sysdate, 'mm'), -2)),
    TO_CHAR(created_date, 'HH24') as "Time",
    count(1) as "Count"
  from
    table1
  where cretd_date >= trunc(last_day(add_months(trunc(sysdate, 'mm'), -2)))
  group by
    TO_CHAR(created_date, 'HH24'),
    last_day(add_months(trunc(sysdate, 'mm'), -2))
  order by
    TO_CHAR(cretd_date, 'HH24')
)
select * from curr, curr_1,curr_2;

实际输出:

2k repeated rows

预期输出:

max 24 rows

last_date  | time   | count   | last_date  | time_1 | count_1 | last_date | time_2| count_2 |
31-july-19 | 00     | 2       | 31-June-19 | 00     | 1       | 31-May-19 | 00    | 3       |
...
31-july-19 | 23     | 34      | 31-June-19 | 23     | 23      | 31-May-19 | 23    | 32      | 

* 如果有任何其他最佳方法可以实现相同的效果,请分享。

【问题讨论】:

  • 请说出投反对票的原因。考虑到你的观点,我会改进这个问题。

标签: sql oracle common-table-expression


【解决方案1】:

我想您想对每月结果进行透视,您可以使用条件聚合。

SELECT TO_CHAR(created_date, 'HH24') AS "Time"
    ,last_day(sysdate) AS m1
    ,last_day(add_months(sysdate, - 1)) m2
    ,last_day(add_months(sysdate, - 2)) m3
    ,count(CASE 
            WHEN created_date >= trunc(last_day(sysdate))
                THEN 1
            END) m1_count
    ,count(CASE 
            WHEN created_date >= trunc(last_day(add_months(sysdate, - 1)))
                THEN 1
            END) m2_count
    ,count(CASE 
            WHEN created_date >= trunc(last_day(add_months(sysdate, - 2)))
                THEN 1
            END) m3_count
FROM table1
GROUP BY TO_CHAR(created_date, 'HH24')
ORDER BY "Time";

注意:由于您尚未提供数据,因此这是未经测试的查询。请尝试告诉我。

【讨论】:

  • 要创建当月的所有日期,我需要做哪些更改?你能推荐一下吗?
  • @shaikmoed :提出一个新问题。
【解决方案2】:

您缺少CURR, CURR_1, CURR_2 之间的连接。

加入应该基于列"Time"

所以你的SELECT 查询应该是这样的:

SELECT
    *
FROM
    CURR JOIN
    CURR_1 USING("Time") JOIN
    CURR_2 USING("Time");

干杯!!

【讨论】:

  • JOIN 是如何工作的?我的意思是Innerleftouter
  • 了解oracle中的JOIN请参考这个Link
  • 抱歉造成误会。您的代码中使用的JOIN 关键字使用的默认连接是什么?它不在提供的链接中。
  • 正常INNER JOIN
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
  • 2018-03-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多