SQL-如何根据条件获取第一次和最后一次出现

SQL-如何根据条件获取第一次和最后一次出现,sql,aggregate-functions,Sql,Aggregate Functions,第一篇文章在这里发表,但我已经多次从这里得到答案——尽管我似乎找不到我当前挑战的答案。 另外,SQL对我来说是3周的新手,所以我为我之前缺乏SQL方面的知识而道歉 我有一个表(日志文件),我想从中获取一些实例的第一个和最后一个日期,以便能够测量不同任务(状态)之间花费的时间 该表看起来有点像这样: article | regdate | status | queue | area --------+----------+--------+-------+----- 1111 | 14/0

第一篇文章在这里发表,但我已经多次从这里得到答案——尽管我似乎找不到我当前挑战的答案。 另外,SQL对我来说是3周的新手,所以我为我之前缺乏SQL方面的知识而道歉

我有一个表(日志文件),我想从中获取一些实例的第一个和最后一个日期,以便能够测量不同任务(状态)之间花费的时间

该表看起来有点像这样:

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似乎正常工作。。至少我现在得到了不同的时间戳:)谢谢!