我目前正致力于在数据库中记录去年登录的用户数。
这是我正在使用的示例模式:http://sqlfiddle.com/#!4/7dfb6/15 (复制如下)
我有这两个问题:
查询 1:
select distinct userid from tosuser tu;
查询 2:
select count (*) from tosevent te where te.LASTUPDATEDATE BETWEEN
to_date('01/01/2014', 'dd/mm/yyyy') AND to_date('31/12/2014', 'dd/mm/yyyy');
我希望加入,给出这样的结果:
USERNAME COUNT
FRED 7
MARY 2
其中 count 是指用户在去年进行的登录次数。 (我目前将年份作为 java 参数传递)
我工作的最接近的事情是:
select distinct username, LASTUPDATEDATE from tosuser tu, tosevent te where
te.LASTUPDATEDATE BETWEEN
to_date('01/01/2014', 'dd/mm/yyyy') AND to_date('31/12/2014', 'dd/mm/yyyy')
and te.username = tu.userid and tu.userenabled='1' and tu.userid!='OASIS';
这给了我每个登录事件。 只是想知道您是否知道我将如何使用 Oracle 语法编写此查询?
如果消失,来自 SQL fiddle 的模式:
CREATE TABLE tosuser ( userid VARCHAR2(30) PRIMARY KEY, IsDeleted INT NOT NULL, UserEnabled INT,ExternalUser INT);
CREATE TABLE tosevent ( id VARCHAR2(30) PRIMARY KEY, username VARCHAR2(30), DATA3 VARCHAR2(30), LASTUPDATEDATE DATE );
INSERT into tosuser (userid, IsDeleted, UserEnabled, ExternalUser) values ('OASIS',1,1,1);
INSERT into tosuser (userid, IsDeleted, UserEnabled, ExternalUser) values ('FRED',1,1,1);
INSERT into tosuser (userid, IsDeleted, UserEnabled, ExternalUser) values ('MARY',1,1,1);
INSERT into tosuser (userid, IsDeleted, UserEnabled, ExternalUser) values ('TOM',1,1,1);
INSERT into tosuser (userid, IsDeleted, UserEnabled, ExternalUser) values ('MICHEAL',1,1,1);
INSERT into tosevent (id, username, DATA3, LASTUPDATEDATE) values (1,'FRED','successful logon',to_date('08/09/2014', 'dd/mm/yyyy'));
INSERT into tosevent (id, username, DATA3, LASTUPDATEDATE) values (2,'FRED','successful logon',to_date('09/09/2014', 'dd/mm/yyyy'));
INSERT into tosevent (id, username, DATA3, LASTUPDATEDATE) values (3,'FRED','successful logon',to_date('10/09/2014', 'dd/mm/yyyy'));
INSERT into tosevent (id, username, DATA3, LASTUPDATEDATE) values (4,'FRED','successful logon',to_date('11/09/2014', 'dd/mm/yyyy'));
INSERT into tosevent (id, username, DATA3, LASTUPDATEDATE) values (5,'FRED','successful logon',to_date('12/09/2014', 'dd/mm/yyyy'));
INSERT into tosevent (id, username, DATA3, LASTUPDATEDATE) values (6,'MARY','successful logon',to_date('08/09/2014', 'dd/mm/yyyy'));
INSERT into tosevent (id, username, DATA3, LASTUPDATEDATE) values (7,'MARY','successful logon',to_date('09/09/2014', 'dd/mm/yyyy'));
谢谢。
最佳答案
我想你只是想要一个group by
:
select username, count(*)
from tosuser tu join
tosevent te
on te.username = tu.userid
where te.LASTUPDATEDATE BETWEEN to_date('01/01/2014', 'dd/mm/yyyy') AND
to_date('31/12/2014', 'dd/mm/yyyy') and
tu.userenabled = '1' and tu.userid <> 'OASIS'
group by username;
您需要小心使用日期。如果 LastUpdateDate
有一个时间部分,那么您要将其表达为:
where te.LASTUPDATEDATE >= date '2014-01-01' and te.LASTUPDATEDATE < date '2015-01-01'
你也可以只看年份来写:
where extract(year from LASTUPDATEDATE) = 2014
但是,这个版本使用索引的效率可能不如以前的版本。
关于mysql - Oracle SQL - 编写带计数查询的连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25745403/