DB2SQL—按日期时间排序的两个字段的密集秩分组
我知道这是一个其他人在过去必须解决的问题,但以我有限的知识,还没有克服困难。我的数据是按datetime排序的,它需要根据两个字段status和queue的组合进行分组。在给定时间范围内状态和队列相同的情况下,它们应被视为同一组的一部分,因此具有相同的id 为了实现这一点,我尝试实现稠密的_-RANK,无论出于什么目的,它都是成功的——除了组的排序。以下是一个例子:DB2SQL—按日期时间排序的两个字段的密集秩分组,sql,db2,dense-rank,Sql,Db2,Dense Rank,我知道这是一个其他人在过去必须解决的问题,但以我有限的知识,还没有克服困难。我的数据是按datetime排序的,它需要根据两个字段status和queue的组合进行分组。在给定时间范围内状态和队列相同的情况下,它们应被视为同一组的一部分,因此具有相同的id 为了实现这一点,我尝试实现稠密的_-RANK,无论出于什么目的,它都是成功的——除了组的排序。以下是一个例子: WITH TEMP1 (EVENT_DATE, PRV_EVENT_DATE, STATUS, PRV_STATUS, QUEUE
WITH TEMP1 (EVENT_DATE, PRV_EVENT_DATE, STATUS, PRV_STATUS, QUEUE, PRV_QUEUE) AS
(VALUES ('2012-09-04 11:40:19.936141', '', 'CREATED', '', 'SYSTEM', '')
,('2012-09-04 11:40:21.207140', '2012-09-04 11:40:19.936141', 'CREATED', 'CREATED', 'SYSTEM', 'SYSTEM')
,('2012-09-04 11:40:27.771140', '2012-09-04 11:40:21.207140', 'PROCESS', 'CREATED', 'PROCESS', 'SYSTEM')
,('2012-09-05 00:01:20.384180', '2012-09-04 11:40:27.771140', 'SUSPEND', 'PROCESS', 'SYSTEM', 'SYSTEM')
,('2012-09-05 00:02:14.042180', '2012-09-05 00:01:20.384180', 'SUSPEND', 'SUSPEND', 'PEND', 'SYSTEM')
,('2012-09-06 00:02:14.642180', '2012-09-05 00:02:14.042180', 'SUSPEND', 'SUSPEND', 'SYSTEM', 'SYSTEM')
,('2012-09-06 00:02:33.433180', '2012-09-06 00:02:14.642180', 'SUSPEND', 'SUSPEND', 'SYSTEM', 'SYSTEM')
)
SELECT
ROW_NUMBER() OVER (ORDER BY EVENT_DATE) AS "RN",
DENSE_RANK() OVER ( ORDER BY status, queue, date(event_date)) AS "GRP",
EVENT_DATE, PRV_EVENT_DATE, STATUS, PRV_STATUS, QUEUE, PRV_QUEUE
FROM TEMP1
ORDER BY EVENT_DATE
结果如下:
RN GRP EVENT_DATE PRV_EVENT_DATE STATUS PRV_STATUS QUEUE
1 1 2012-09-04 11:40:19.936141 CREATED SYSTEM
2 1 2012-09-04 11:40:21.207140 2012-09-04 11:40:19.936141 CREATED CREATED SYSTEM
3 2 2012-09-04 11:40:27.771140 2012-09-04 11:40:21.207140 PROCESS CREATED PROCESS
4 4 2012-09-05 00:01:20.384180 2012-09-04 11:40:27.771140 SUSPEND PROCESS SYSTEM
5 3 2012-09-05 00:02:14.042180 2012-09-05 00:01:20.384180 SUSPEND SUSPEND PEND
6 5 2012-09-06 00:02:14.642180 2012-09-05 00:02:14.042180 SUSPEND SUSPEND SYSTEM
正如你所知道的,GRP出了问题,我也知道使用dateEVENT\u DATE不是解决方案。至少我不清楚你到底想要什么。当状态或队列与前一组相比发生变化时,是否创建新组?还是有更复杂的规则 看起来您的数据已经是一个查询的结果,在该查询中,您使用前一行和前一行之间的MINstatus/queue OVER行计算上一个值 当你决定某个日期时,你永远不会得到正确的顺序,请尝试这样的计算:
SUM(CASE WHEN status = prv_status AND queue = prv_queue THEN 0 ELSE 1 END)
OVER (ORDER BY event_date
ROWS UNBOUNDED PRECEDING)
编辑:
如果没有求和,则必须使用标量子查询作为稠密_秩的输入,这应该可以:
SELECT
(SELECT MAX(event_date)
FROM TEMP1 AS t2
WHERE t2.event_date < t1.event_date
AND t1.status <> t2.status
AND t1.QUEUE <> t2.queue) AS x,
DENSE_RANK() OVER ( ORDER BY x) AS "GRP",
当然,表现可能很糟糕
也许您最好保持错误的顺序,至少对于一个组的所有行都是相同的错误值:-我不相信我的db2版本支持此函数。我正在运行DB2 UDB for AS/400,06.01.0000 V6R1m0,Java JDBC驱动程序5.0的AS/400工具箱,并收到以下错误SQL0104-令牌无效。有效令牌:,从到。State:37000,Native:-104,Origin:[IBM][iSeries-Access-ODBC-Driver][DB2-UDB]Ooops,如果没有这些OLAP函数,您需要编写一个旧式的标量子查询以在密集列中使用。我会修改我的答案