【问题标题】:SQL - Select from TableA, then Select Count from TableASQL - 从 TableA 中选择,然后从 TableA 中选择计数
【发布时间】:2018-06-12 11:28:56
【问题描述】:

我有表 A。它有一个按日期列出的 ID 数据列表。

ID 可以有多个记录。

ID STARTDATE
-- ------------
1  APR-1-2017
2  JAN-1-2017
3  JULY-5-2016
4  DEC-6-2015
5  FEB-3-2017
5  JAN-1-2018
1  JAN-1-2018

我希望能够选择任何特定的日期或日期范围,这将为我提供该日期的 ID。然后我想选择这些 ID 过去 365 天的计数。

我能够让查询正常工作。但唯一的问题是我使用的应用程序不理解WITH Temp Table。

是否有替代方法来编写此查询?

WITH list_to_compare as (select distinct(ID) AS LASTWEEKOUT 
                        from TABLEA 
                        WHERE TIMESTAMP >= SYSDATE -1)
SELECT TABLEA.ID,count(*)
    from list_to_compare LTC 
        LEFT OUTER join TABLEA 
            on LTC.lastweekout = TABLEA.ID
WHERE TABLEA.TIMESTAMP >= SYSDATE - 365 
group by TABLEA.ID
having COUNT(*) > 12;

【问题讨论】:

  • 附注:当它不是表的 ID 时,您不应该调用列 ID。从名为ID 的列中,我们希望它能够唯一标识表中的一条记录。

标签: sql oracle select count


【解决方案1】:

您想为某些 ID 选择数据。出于某种原因,您认为您必须将这些 ID 加入您的表,但实际上它只是标准,最好属于 WHERE 子句。 (您甚至可以将表伪外部连接到 ID,尽管您从日期中知道您将始终有一个匹配项。)

这是在WHERE 子句中放置条件的查询:

select id, count(*)
from tablea
where id in (select id from tablea where timestamp >= sysdate - 1)
and timestamp >= sysdate - 365 
group by id
having count(*) > 12;

但无论如何您都在进行汇总,您甚至可以在 HAVING 子句中查找所有条件,从而只从表中选择一次:

select id, count(*)
from tablea
where timestamp >= sysdate - 365 
group by id
having count(*) > 12
and count(case when timestamp >= sysdate - 1 then 1 end) > 0;

【讨论】:

  • 太麻烦了,我实际上遇到了一个问题,你的建议也解决了这个问题。
【解决方案2】:

我不完全了解您需要什么,但是您可以将 WITH 表替换为内部选择

SELECT Table1.ID,count(*)
    from (select distinct(ID) AS LASTWEEKOUT from Table1) LTC LEFT OUTER join Table1  on LTC.lastweekout = Table1.ID
WHERE Table1.STARTDATE >= SYSDATE - 365 
group by Table1.ID
having COUNT(*) > 12;

【讨论】:

    【解决方案3】:

    只需将 WITH 因式分解子句的“表”移动到内联视图中:

    SELECT TABLEA.ID,count(*)
        from (select distinct(ID) AS LASTWEEKOUT 
              from TABLEA 
              WHERE TIMESTAMP >= SYSDATE -1) LTC
        LEFT OUTER join TABLEA  on LTC.lastweekout = TABLEA.ID
    WHERE TABLEA.TIMESTAMP >= SYSDATE - 365 
    group by TABLEA.ID
    having COUNT(*) > 12;
    

    【讨论】:

      【解决方案4】:

      ...我正在使用的应用程序不理解 WITH Temp Table。

      很有可能它只是不喜欢 outer 查询以 WITH 开头 - 您可以通过使用 select * from (…) 包装每个查询来解决这个问题:

      with w as (select * from dual)
      select * from w;
      
      |假人 | | :---- | | X |
      select *
      from ( with w as (select * from dual)
             select * from w );
      
      |假人 | | :---- | | X |

      dbfiddle here

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-11
        • 1970-01-01
        • 2023-03-06
        • 1970-01-01
        • 1970-01-01
        • 2016-06-20
        • 1970-01-01
        相关资源
        最近更新 更多