SQL-如何根据条件获取第一次和最后一次出现
第一篇文章在这里发表,但我已经多次从这里得到答案——尽管我似乎找不到我当前挑战的答案。 另外,SQL对我来说是3周的新手,所以我为我之前缺乏SQL方面的知识而道歉 我有一个表(日志文件),我想从中获取一些实例的第一个和最后一个日期,以便能够测量不同任务(状态)之间花费的时间 该表看起来有点像这样:SQL-如何根据条件获取第一次和最后一次出现,sql,aggregate-functions,Sql,Aggregate Functions,第一篇文章在这里发表,但我已经多次从这里得到答案——尽管我似乎找不到我当前挑战的答案。 另外,SQL对我来说是3周的新手,所以我为我之前缺乏SQL方面的知识而道歉 我有一个表(日志文件),我想从中获取一些实例的第一个和最后一个日期,以便能够测量不同任务(状态)之间花费的时间 该表看起来有点像这样: article | regdate | status | queue | area --------+----------+--------+-------+----- 1111 | 14/0
article | regdate | status | queue | area
--------+----------+--------+-------+-----
1111 | 14/05/14 | 2 | LO2ST | P2
1123 | 14/03/21 | 3 | INLOA | P1
1123 | 14/03/21 | 2 | LO2ST | P2
1123 | 14/03/20 | 3 | INLOA | P1
1111 | 14/04/21 | 2 | LO2ST | P2
物品、注册日期、状态、队列、区域
我想在文章级别上进行度量,但每篇文章都可以在表中出现多次,并且每个状态都可以出现多次。我希望能够获取实例的第一次(最小(时间))和另一个实例的最后一次(最大(时间))
包含数据的表(A)可以如下所示:
article | regdate | status | queue | area
--------+----------+--------+-------+-----
1111 | 14/05/14 | 2 | LO2ST | P2
1123 | 14/03/21 | 3 | INLOA | P1
1123 | 14/03/21 | 2 | LO2ST | P2
1123 | 14/03/20 | 3 | INLOA | P1
1111 | 14/04/21 | 2 | LO2ST | P2
现在,我想为每篇文章获取状态3上最早出现的事件,并为每篇文章获取状态2上最新出现的事件
我尝试过以下方法:
SELECT
article,
(select min(regdate) from A where status = 3 and queue = INLOA) as FIRSTLOA,
(select max(regdate) from A where status = 2 and queue = LO2ST) as LAST
FROM A
GROUP BY A
但这只是给出了表中所有记录第一次出现的状态3,以及表中最后一次出现的状态2
如何在文章级别使用给定的参数获取第一次和最后一次出现?- 首先排一行
- 第二,找出最小值和最大值
- 第三,选择与最小值和最大值匹配的项目
SELECT article, regdate, status, queue, area FROM ( -- Second find the min and max SELECT article, regdate, status, queue, area, RN, MAX(rn) OVER (PARTITION BY status, queue) as MAXRN, MIN(rn) OVER (PARTITION BY status, queue) as MINRN ROW_NUMBER() OVER (PARTITION BY status, queue ORDER BY regdate) as RN FROM ( -- First make a row_number SELECT article, regdate, status, queue, area, ROW_NUMBER() OVER (PARTITION BY status, queue ORDER BY regdate) as RN ) sub1 ) sub2 WHERE -- Third take the items that match min and max RN = MAXRN OR RN = MINRN
SELECT article,
min(case when status = 3 and queue = INLOA then regdate end) as FirstLOA,
min(case when status = 2 and queue = LO2ST then regdate end) as LAST
FROM A
GROUP BY A;
您使用的是什么数据库?我不确定,但认为是SQL Server-在查看系统信息时获取此信息:SQL Server:10.50.4000,Direct=TRUEThis似乎正常工作。。至少我现在得到了不同的时间戳:)谢谢!