代码之家  ›  专栏  ›  技术社区  ›  user206168

SQL-从TableA中选择,然后从TableA中选择Count

  •  0
  • user206168  · 技术社区  · 8 年前

    我有桌子。它有一个按日期列出的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。然后,我想选择过去365天内这些ID的计数。

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

    是否有其他方法编写此查询?

    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;
    
    4 回复  |  直到 8 年前
        1
  •  3
  •   Thorsten Kettner    8 年前

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

    以下是查询,其中的条件放置在 哪里 条款:

    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
  •  1
  •   Yossi Vainshtein    8 年前

    我不知道你到底需要什么,但是你可以把 WITH 具有内部select的表格

    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
  •  1
  •   Littlefoot    8 年前

    只需将WITH factoring子句的“table”移动到内联视图中:

    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
  •  1
  •   user6854914 user6854914    8 年前

    我使用的应用程序无法理解Temp表格。

    很有可能它只是不喜欢 外面的 要开始的查询 WITH 您可以通过将每个查询包装为 select * from (…) :

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

    D小提琴 here