每个用户号码的最新记录?

时间:2017-01-15 05:15:08

标签: sql-server greatest-n-per-group

我进行了搜索,但每个问题的唯一性使我很难为我的数据集“翻译”它。

我有一个名为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的所有用户?

1 个答案:

答案 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