Sql 在两列上选择DISTINCT,并返回多列

Sql 在两列上选择DISTINCT,并返回多列,sql,database,db2,Sql,Database,Db2,我正在使用下面的查询 SELECT TIMESTAMP,substr(DBNAME,1,10) as DBNAME, MSGSEVERITY as SEV, MSGNUM, substr(MSG,1,80) as MSG_trunc FROM TABLE ( PD_GET_LOG_MSGS( CURRENT_TIMESTAMP - 30 DAYS)) AS T WHERE MSGSEVERITY NOT IN 'I' ORDER BY TIMESTAMP 下面是输出 TIMESTAMP

我正在使用下面的查询

SELECT TIMESTAMP,substr(DBNAME,1,10) as DBNAME, MSGSEVERITY as SEV, MSGNUM, substr(MSG,1,80) as MSG_trunc FROM TABLE ( PD_GET_LOG_MSGS( CURRENT_TIMESTAMP - 30 DAYS)) AS T WHERE MSGSEVERITY NOT IN 'I'  ORDER BY TIMESTAMP
下面是输出

TIMESTAMP                  DBNAME     SEV MSGNUM      MSG_TRUNC
-------------------------- ---------- --- ----------- ---------------------------------------------------
2019-11-17-05.45.33.266795 ABC        W          1602 ADM1602W  Rollforward recovery has been initiated.

2019-11-17-05.45.39.086945 XYZ        W          1602 ADM1602W  Rollforward recovery has been initiated.

2019-11-17-05.45.42.960668 ABC        W          1602 ADM1602W  Rollforward recovery has been initiated.

2019-11-17-05.45.48.287948 XYZ        W          1602 ADM1602W  Rollforward recovery has been initiated.

2019-11-17-07.04.09.038759 ABC        W          1611 ADM1611W  The rollforward recovery phase has been completed.

2019-11-17-07.04.14.688757 XYZ        W          1611 ADM1611W  The rollforward recovery phase has been completed.

2019-11-17-07.04.18.339282 XYZ        W          1611 ADM1611W  The rollforward recovery phase has been completed.
我可以用不同的DBNAME和MSGNUM获得输出吗

输出应如下所示

TIMESTAMP                  DBNAME     SEV MSGNUM      MSG_TRUNC
-------------------------- ---------- --- ----------- ---------------------------------------------------
2019-11-17-05.45.33.266795 ABC        W          1602 ADM1602W  Rollforward recovery has been initiated.

2019-11-17-05.45.39.086945 XYZ        W          1602 ADM1602W  Rollforward recovery has been initiated.

2019-11-17-07.04.09.038759 ABC        W          1611 ADM1611W  The rollforward recovery phase has been completed.

2019-11-17-07.04.14.688757 XYZ        W          1611 ADM1611W  The rollforward recovery phase has been completed.

您可以获取
max
时间戳,并使用
分组依据

SELECT max(TIMESTAMP)
    , DBNAME
    , SEV
    , MSGNUM
    , MSG_trunc 
FROM    
    (SELECT TIMESTAMP
        , substr(DBNAME,1,10) as DBNAME
        , MSGSEVERITY as SEV
        , MSGNUM
        , substr(MSG,1,80) as MSG_trunc 
    FROM TABLE (PD_GET_LOG_MSGS(CURRENT_TIMESTAMP - 30 DAYS)) AS T 
    WHERE MSGSEVERITY NOT IN 'I') t  
GROUP BY DBNAME
    , SEV
    , MSGNUM
    , MSG_trunc 
ORDER BY TIMESTAMP

您可以获取
max
时间戳,并使用
分组依据

SELECT max(TIMESTAMP)
    , DBNAME
    , SEV
    , MSGNUM
    , MSG_trunc 
FROM    
    (SELECT TIMESTAMP
        , substr(DBNAME,1,10) as DBNAME
        , MSGSEVERITY as SEV
        , MSGNUM
        , substr(MSG,1,80) as MSG_trunc 
    FROM TABLE (PD_GET_LOG_MSGS(CURRENT_TIMESTAMP - 30 DAYS)) AS T 
    WHERE MSGSEVERITY NOT IN 'I') t  
GROUP BY DBNAME
    , SEV
    , MSGNUM
    , MSG_trunc 
ORDER BY TIMESTAMP
试试这个:

SELECT *
FROM
(
SELECT 
  TIMESTAMP
, substr(DBNAME, 1, 10) as DBNAME
, MSGSEVERITY as SEV
, MSGNUM
, substr(MSG, 1, 80) as MSG_trunc 
, ROWNUMBER() OVER (PARTITION BY DBNAME, MSGNUM ORDER BY TIMESTAMP) RN
FROM TABLE (PD_GET_LOG_MSGS(CURRENT_TIMESTAMP - 30 DAYS)) AS T 
WHERE MSGSEVERITY NOT IN 'I'
)
WHERE RN=1
ORDER BY TIMESTAMP;
试试这个:

SELECT *
FROM
(
SELECT 
  TIMESTAMP
, substr(DBNAME, 1, 10) as DBNAME
, MSGSEVERITY as SEV
, MSGNUM
, substr(MSG, 1, 80) as MSG_trunc 
, ROWNUMBER() OVER (PARTITION BY DBNAME, MSGNUM ORDER BY TIMESTAMP) RN
FROM TABLE (PD_GET_LOG_MSGS(CURRENT_TIMESTAMP - 30 DAYS)) AS T 
WHERE MSGSEVERITY NOT IN 'I'
)
WHERE RN=1
ORDER BY TIMESTAMP;

我得到了以下错误:SQL0119N在GROUP BY子句中未指定以SELECT子句、HAVING子句或ORDER BY子句中指定的“DBNAME”开头的表达式,或者该表达式在SELECT子句、HAVING子句或ORDER BY子句中具有列函数,并且未指定GROUP BY子句。SQLSTATE=42803@AbhiramVarma,是的,忘记包含dbname,请再试一次。我在GROUPBY子句中添加了dbname,然后出现以下错误:SQL0134N字符串列、主机变量、常量或函数“GROUPBY column 1”使用不当。SQLSTATE=42907您是否在GROUPBY中添加了`substr(DBNAME,1,10)`呢?我执行了上述查询,并得到了错误SQL0134N:字符串列、主机变量、常量或函数“GROUPBY column 1”的不当使用。SQLSTATE=42907I收到以下错误:SQL0119N GROUP BY子句中未指定以SELECT子句、HAVING子句或ORDER BY子句中指定的“DBNAME”开头的表达式,或者该表达式位于SELECT子句、HAVING子句或ORDER BY子句中,具有列函数,且未指定GROUP BY子句。SQLSTATE=42803@AbhiramVarma,是的,忘记包含dbname,请再试一次。我在GROUPBY子句中添加了dbname,然后出现以下错误:SQL0134N字符串列、主机变量、常量或函数“GROUPBY column 1”使用不当。SQLSTATE=42907您是否在GROUPBY中添加了`substr(DBNAME,1,10)`呢?我执行了上述查询,并得到了错误SQL0134N:字符串列、主机变量、常量或函数“GROUPBY column 1”的不当使用。SQLSTATE=42907是否正确,需要从每个组(DBNAME,MSGNUM)中获取具有最早时间戳的1行?是否正确,需要从每个组(DBNAME,MSGNUM)中获取具有最早时间戳的1行?