給定一個表,持有一個用戶的狀態歷史:
給定一個表,持有一個用戶的狀態歷史。
| ID | 用戶ID | MODIFIEDSTATUS
|---|---|
| 1 | 1 |
我想提供一個日期,即2020年7月1日,并了解有多少UserIds在那一天是活躍的。
因此,我需要檢查最接近但不超過2020年7月1日的修改日期,按用戶ID分組。
2020年7月1日的預期結果:
| ID | 用戶ID | MODIFIEDSTATUS||
|---|---|---|---|
| 2 | 1 | 01.07.2020 | 04.06.2020? |
從那里我可以直接總結狀態,看到我有兩個用戶在檢查日期01.07.2020.
活躍。目前第一步的方法是:
select max(id),userid,max(modified
keep (dense_rank first order by modified) as id
from MY_TABLE
where modified <= '01.07.2020'
group by userid。
它還不能提供完全正確的結果
。最后一步將是一個簡單的總和,我想,類似于:
。
Select sum(case when status = 'active' then 1 else 0 end) as "active_users"
from MY_TABLE t1
inner join (
select max(id)
保持(dense_rank first order by modified) as id
from MY_TABLE
where modified <= '01.07.2020'
group by userid
) t2 on t1.id = t2.id
uj5u.com熱心網友回復:
你可以使用row_number()來獲得截至該日期的最后狀態:
select count(*)
from (select t.*,
row_number() over (partition by userid order by modified desc) as seqnum
from my_table t
where t.modified <= date '2020-07-01'where seqnum = 1 and status = 'Active';
另一個選項是一個相關的子查詢:
select count(*)
from my_table t
where t.modified = (select max(t2.modified))
from my_table t2
where t2.userid = t.userid and
t2.modified <=date '2020-07-01'
) 而且
t.status = 'Active'。
或者,你可以使用兩級聚合:
select count(*)
from (select userid,
max(status) keep (dense_rank first order by modification desc) as status
from my_table t
where t.modified <= date '2020-07-01'
group by userid
) t
where status = 'Active'/span>;
uj5u.com熱心網友回復:
因為你要找的是離所提供的日期最近的活躍用戶的數量,所以下面的方法就可以了。
select count(distinct userid)
from table
where modified <= '01.07.2020'
and status='Active'
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/308138.html
標籤:
上一篇:<p>SP在TOAD中作業正常,但在SQL*PLUS中不作業。它正在抱怨觸發器中使用了新的關鍵字。我正在使用<code>SETSQLBLANKLINESON</code&
