我正在使用SQL构建程序(COBOL),以跟踪用户特殊时间的记录时间。
我有3张桌子:
table 1 - user logged time
table 2 - user logged time
table 3 - user profile
同一用户不在表1和表2上,所有用户都在表3上。
我必须计算有多少用户在上次登录时使用配置文件X: 不到一个小时 1小时至5小时之间 超过5小时。
我找到了一种使用表1和表3进行1计数的方法:
`SELECT COUNT (DISTINCT A.user)
FROM table1 A
LEFT JOIN table3 B
ON B.user = A.user
WHERE B.profile = 'X'
AND A.HTIMEST = (SELECT MAX(HTIMEST)
FROM table1 A
WHERE B.user = A.user)
AND A.time BETWEEN 0 AND 1 `
这将意味着在一个程序中进行大量查询。
如果您能提供任何帮助,我将非常感谢。
谢谢。
Table1:
User TimeLog Timestamp
1 0,5 2019-01-01
1 6 2018-11-31
4 2 2018-12-31
Table2:
User TimeLog Timestamp
2 0,5 2019-01-01
3 6 2018-11-31
5 2 2018-12-31
Table3:
User Profile
1 X
2 X
3 Z
4 X
5 Z
预期结果:
Time loged Count
<1h 2 (User 1 e User 2)
>1h -<5h 1 (User 4) (User 5 doesn't have the right profile)
>5h 0 (User 3 doesn't have the right profile, and user 1 has more
recent data)
答案 0 :(得分:0)
您可以使用UNION将多个选择语句组合为一个结果。
在您的情况下,创建一个VIEW合并表table1
和table2
的方法可能很有意义。
CREATE VIEW logs AS
SELECT user, timelog, timestamp FROM table1
UNION ALL
SELECT user, timelog, timestamp FROM table2;
然后基于该视图构建查询,INNER JOIN
(JOIN reference)个人资料为“ X”的用户,INNER JOIN
一个查询,该查询获得每个用户的最高时间戳,并使用CASE语句(基本上是if / else)来确定时间类别。根据案例陈述进行分组并统计用户。
SELECT
CASE
WHEN l.timelog < 1 THEN '<1h'
WHEN l.timelog <= 5 THEN '>=1h - <=5h'
ELSE '>5h'
END AS time_logged,
COUNT(l.user)
FROM
logs l
INNER JOIN table3 u ON
l.user = u.user
AND u.profile = 'X'
INNER JOIN (
SELECT
user,
MAX(timestamp) AS timestamp
FROM
logs
GROUP BY
user
) m ON
l.user = m.user
AND l.timestamp = m.timestamp
GROUP BY
CASE
WHEN l.timelog < 1 THEN '<1h'
WHEN l.timelog <= 5 THEN '>=1h - <=5h'
ELSE '>5h'
END;