我进行了搜索,但每个问题的唯一性使我很难为我的数据集“翻译”它。
我有一个名为CLOGS17的表A. 使用显示的数据和字段的子集:
SERIALNO EVDATE SYSNO AREA USRNO
4 2017-01-01 02:03:48.000 1 4 10
4 2017-01-01 02:09:00.000 1 4 10
4 2017-01-01 02:24:44.997 1 6 10
4 2017-01-01 02:56:50.000 1 2 18
5 2017-08-08 02:03:48.000 1 4 10
5 2017-01-09 02:09:00.000 1 4 10
6 2017-04-03 02:24:44.997 1 6 10
8 2017-05-05 02:56:50.000 1 2 18
我的目标是检索过去30天内没有使用SERIALNO + SYSNO + AREA + USRNO组合的所有记录(非活动用户essentiallY),这样我就可以删除USRNO。
上述数据的期望输出(每个SERIALNO,SYSNO,AREA和USRNO独特组合的最新记录):
SERIALNO EVDATE SYSNO AREA USRNO
4 2017-01-01 02:09:00.000 1 4 10
4 2017-01-01 02:24:44.997 1 6 10
4 2017-01-01 02:56:50.000 1 2 18
5 2017-08-08 02:03:48.000 1 4 10
6 2017-04-03 02:24:44.997 1 6 10
8 2017-05-05 02:56:50.000 1 2 18
然后我才能获得过去30天内的那些。
鉴于下面的表格数据(“表B”),它是所有存储用户的列表:
SERIALNO CONTID SYSNO AREA USRID
36 001 1 * 1
36 001 1 * 18
36 001 1 * 2
36 001 1 * 29
36 001 1 * 36
36 001 1 1 10
此表包含系统中的所有用户。
如何从表B返回尚未用于给定CONTID,SYSNO和AREA的所有用户?
答案 0 :(得分:1)
对于问题的第一部分,它就像所需字段上的group by
选项一样简单:
SELECT SERIALNO,
SYSNO,
AREA,
USRNO,
MAX(EVDATE)
FROM CLOGS17
GROUP BY SERIALNO,
SYSNO,
AREA,
USRNO
由于您未提供有关第二部分的足够信息。此查询将为您提供您在问题中显示的输出。
因此,为了让所有不符合30天标准的用户(无论是什么),您只需使用上述查询执行left join
用户表,寻找上述查询的空值,如这样:
SELECT *
FROM tableb tb LEFT JOIN
(SELECT SERIALNO,
SYSNO,
AREA,
USRNO,
MAX(EVDATE)
FROM CLOGS17
GROUP BY SERIALNO,
SYSNO,
AREA,
USRNO) a
ON tb.SERIALNO = a.SERIALNO,
AND tb.SYSNO = a.SYSNO
AND tb.USRNO = a.USRNO
WHERE a.AREA is null