Sql 仅从表中获取第一次和最后一次出现

Sql 仅从表中获取第一次和最后一次出现,sql,sql-server,Sql,Sql Server,我有一张这样的桌子: ID action Date xxx action1 20140101 xxx action2 20140102 yyy action1 20140116 yyy action2 20140117 yyy action3 20140122 yyy action4 20140123 yyy action5 20140131 zzz action1 20140103 zzz action2 20140106 zzz action3 20140107 或者做一些其他的阐述 ID

我有一张这样的桌子:

ID action Date xxx action1 20140101 xxx action2 20140102 yyy action1 20140116 yyy action2 20140117 yyy action3 20140122 yyy action4 20140123 yyy action5 20140131 zzz action1 20140103 zzz action2 20140106 zzz action3 20140107 或者做一些其他的阐述

ID firstAction Date LastAction Date
xxx action1 20140101 action2 20140102
yyy action1 20140116 action5 20140131
zzz action1 20140103 action3 20140107
这些结果可以用java或C++编写,很容易实现。使用SQL?
首先我按ID排序,然后按日期排序,但我不知道如何继续

您可以使用窗口功能执行此操作:

select t.id, t.action, t.date
from (select t.*,
             row_number() over (partition by id order by date asc) as seqnum_asc,
             row_number() over (partition by id order by date desc) as seqnum_desc
      from table t
     ) t
where seqnum_asc = 1 or seqnum_desc = 1;

可以使用窗口功能执行此操作:

select t.id, t.action, t.date
from (select t.*,
             row_number() over (partition by id order by date asc) as seqnum_asc,
             row_number() over (partition by id order by date desc) as seqnum_desc
      from table t
     ) t
where seqnum_asc = 1 or seqnum_desc = 1;

可以使用窗口功能执行此操作:

select t.id, t.action, t.date
from (select t.*,
             row_number() over (partition by id order by date asc) as seqnum_asc,
             row_number() over (partition by id order by date desc) as seqnum_desc
      from table t
     ) t
where seqnum_asc = 1 or seqnum_desc = 1;

可以使用窗口功能执行此操作:

select t.id, t.action, t.date
from (select t.*,
             row_number() over (partition by id order by date asc) as seqnum_asc,
             row_number() over (partition by id order by date desc) as seqnum_desc
      from table t
     ) t
where seqnum_asc = 1 or seqnum_desc = 1;

可以在SQL中使用最小和最大聚合函数执行此操作,如下所示:

SELECT ID, MIN(Date) AS FirstActionDate, MAX(Date) AS LastActionDate 
FROM Table 
GROUP BY ID

可以在SQL中使用最小和最大聚合函数执行此操作,如下所示:

SELECT ID, MIN(Date) AS FirstActionDate, MAX(Date) AS LastActionDate 
FROM Table 
GROUP BY ID

可以在SQL中使用最小和最大聚合函数执行此操作,如下所示:

SELECT ID, MIN(Date) AS FirstActionDate, MAX(Date) AS LastActionDate 
FROM Table 
GROUP BY ID

可以在SQL中使用最小和最大聚合函数执行此操作,如下所示:

SELECT ID, MIN(Date) AS FirstActionDate, MAX(Date) AS LastActionDate 
FROM Table 
GROUP BY ID
试试这个:

select x.ID, x.mindate as FirstActionDate, x.FirstAction as FirstAction, y.maxdate as LastActionDate, y.LastAction as LastAction
from 
(
  --FirstDate and Action 
  select a.ID, a.mindate as mindate, t.action as FirstAction 
  from 
  (

    select ID, Min(date) as mindate
     from data
     group by ID
   ) a inner join data t on a.mindate = t.date
 ) x inner join 
  (
    --Last Date And Action
    select a.ID, a.maxdate, t.action as LastAction 
    from 
    (

      select ID, max(date) as maxdate
       from data
       group by ID
     ) a inner join data t on a.maxdate = t.date
  ) y on x.ID = y.ID

编辑:我认为正确的方法是: (更新了演示以匹配您的样本数据)

  • 获取ID和第一个日期(
    min(date)
    ),然后加入原始表(
    a.mindate=t.date
    )以获取操作名称-这将为您提供故事的一半-表
    x
  • 以类似的方式,您可以构建表
    y
    ,以获取最后日期和操作
  • 最后,在
    ID
    列上加入它们,以获得单个
    select
    语句中的所有列 试试这个:

    select x.ID, x.mindate as FirstActionDate, x.FirstAction as FirstAction, y.maxdate as LastActionDate, y.LastAction as LastAction
    from 
    (
      --FirstDate and Action 
      select a.ID, a.mindate as mindate, t.action as FirstAction 
      from 
      (
    
        select ID, Min(date) as mindate
         from data
         group by ID
       ) a inner join data t on a.mindate = t.date
     ) x inner join 
      (
        --Last Date And Action
        select a.ID, a.maxdate, t.action as LastAction 
        from 
        (
    
          select ID, max(date) as maxdate
           from data
           group by ID
         ) a inner join data t on a.maxdate = t.date
      ) y on x.ID = y.ID
    

    编辑:我认为正确的方法是: (更新了演示以匹配您的样本数据)

  • 获取ID和第一个日期(
    min(date)
    ),然后加入原始表(
    a.mindate=t.date
    )以获取操作名称-这将为您提供故事的一半-表
    x
  • 以类似的方式,您可以构建表
    y
    ,以获取最后日期和操作
  • 最后,在
    ID
    列上加入它们,以获得单个
    select
    语句中的所有列 试试这个:

    select x.ID, x.mindate as FirstActionDate, x.FirstAction as FirstAction, y.maxdate as LastActionDate, y.LastAction as LastAction
    from 
    (
      --FirstDate and Action 
      select a.ID, a.mindate as mindate, t.action as FirstAction 
      from 
      (
    
        select ID, Min(date) as mindate
         from data
         group by ID
       ) a inner join data t on a.mindate = t.date
     ) x inner join 
      (
        --Last Date And Action
        select a.ID, a.maxdate, t.action as LastAction 
        from 
        (
    
          select ID, max(date) as maxdate
           from data
           group by ID
         ) a inner join data t on a.maxdate = t.date
      ) y on x.ID = y.ID
    

    编辑:我认为正确的方法是: (更新了演示以匹配您的样本数据)

  • 获取ID和第一个日期(
    min(date)
    ),然后加入原始表(
    a.mindate=t.date
    )以获取操作名称-这将为您提供故事的一半-表
    x
  • 以类似的方式,您可以构建表
    y
    ,以获取最后日期和操作
  • 最后,在
    ID
    列上加入它们,以获得单个
    select
    语句中的所有列 试试这个:

    select x.ID, x.mindate as FirstActionDate, x.FirstAction as FirstAction, y.maxdate as LastActionDate, y.LastAction as LastAction
    from 
    (
      --FirstDate and Action 
      select a.ID, a.mindate as mindate, t.action as FirstAction 
      from 
      (
    
        select ID, Min(date) as mindate
         from data
         group by ID
       ) a inner join data t on a.mindate = t.date
     ) x inner join 
      (
        --Last Date And Action
        select a.ID, a.maxdate, t.action as LastAction 
        from 
        (
    
          select ID, max(date) as maxdate
           from data
           group by ID
         ) a inner join data t on a.maxdate = t.date
      ) y on x.ID = y.ID
    

    编辑:我认为正确的方法是: (更新了演示以匹配您的样本数据)

  • 获取ID和第一个日期(
    min(date)
    ),然后加入原始表(
    a.mindate=t.date
    )以获取操作名称-这将为您提供故事的一半-表
    x
  • 以类似的方式,您可以构建表
    y
    ,以获取最后日期和操作
  • 最后,在
    ID
    列上加入它们,以获得单个
    select
    语句中的所有列

    此解决方案有效,谢谢。在标记最佳答案之前,我将测试其他答案此解决方案不会给出正确的第一个和最后一个操作如果添加第一个/最后一个操作会发生什么?@Serpiton为什么?一些随机测试似乎是正确的valid@Davide因为action1,…,action5看起来像是假数据,而不是真实数据,例如,如果action1是“与我的老板会面”,action2是“编码查询”
    MIN
    MAX
    将给出错误的值,将第一个动作与第二个日期匹配,检查此项以了解将发生什么情况此解决方案有效,谢谢。在标记最佳答案之前,我将测试其他答案此解决方案不会给出正确的第一个和最后一个操作如果添加第一个/最后一个操作会发生什么?@Serpiton为什么?一些随机测试似乎是正确的valid@Davide因为action1,…,action5看起来像是假数据,而不是真实数据,例如,如果action1是“与我的老板会面”,action2是“编码查询”
    MIN
    MAX
    将给出错误的值,将第一个动作与第二个日期匹配,检查此项以了解将发生什么情况此解决方案有效,谢谢。在标记最佳答案之前,我将测试其他答案此解决方案不会给出正确的第一个和最后一个操作如果添加第一个/最后一个操作会发生什么?@Serpiton为什么?一些随机测试似乎是正确的valid@Davide因为action1,…,action5看起来像是假数据,而不是真实数据,例如,如果action1是“与我的老板会面”,action2是“编码查询”
    MIN
    MAX
    将给出错误的值,将第一个动作与第二个日期匹配,检查此项以了解将发生什么情况此解决方案有效,谢谢。在标记最佳答案之前,我将测试其他答案此解决方案不会给出正确的第一个和最后一个操作如果添加第一个/最后一个操作会发生什么?@Serpiton为什么?一些随机测试似乎是正确的valid@Davide因为action1,…,action5看起来像是假数据,而不是真实数据,例如,如果action1是“与我的老板会面”,action2是“编码查询”
    MIN
    MAX
    将给出错误的值,将第一个动作与第二个日期匹配,检查此项以查看将发生什么