如何聚合 3 个与 MIN(DATE) 不同的列?

How do I aggregate 3 columns that are different with MIN(DATE)?

我遇到了一个我无法解决的简单问题,我有这个问题:

     SELECT 
            MIN(TEA_InicioTarefa),
            PFJ_Id_Analista,
            ATC_Id, 
            SRV_Id
        FROM  
            dbo.TarefaEtapaAreaTecnica 
   INNER JOIN Tarefa t ON t.TRF_Id = TarefaEtapaAreaTecnica.TRF_Id
   WHERE SRV_Id = 88  
   GROUP BY SRV_Id, ATC_Id, PFJ_Id_Analista
   ORDER BY ATC_Id ASC

它 returns 我这个:

我可以用 GROUP BY SRV_Id、ATC_Id、PFJ_Id_Analista 对它进行一些分组,这给了我这 8 条记录,但是正如你所看到的一些 PFJ_Id_Analista 是不同的。

我想要的是select只有SRV_Id和ATC_Id的早日期,PFJ_Id_Analista不需要分组,如果我去掉PFJ_Id_Analista 从分组中查询有效,但我需要该列。

例如:在第 2 行和第 3 行之间,我只想要早期日期,所以它将是第 2 行。第 5 到 8 行也是如此,我只想要第 6 行。

TarefaEtapaAreaTecnica 的 DDL(重要关键字:TRF_Id)

CREATE TABLE [dbo].[TarefaEtapaAreaTecnica](
    [TEA_Id] [int] IDENTITY(1,1) NOT NULL,
    **[TRF_Id] [int] NOT NULL,**
    [ETS_Id] [int] NOT NULL,
    [ATC_Id] [int] NOT NULL,
    [TEA_Revisao] [int] NOT NULL,
    [PFJ_Id_Projetista] [int] NULL,
    [TEA_DoctosQtd] [int] NULL,
    [TEA_InicioTarefa] [datetime2](7) NULL,
    [PFJ_Id_Analista] [int] NULL,
    [TEA_FimTarefa] [datetime2](7) NULL,
    [TEA_HorasQtd] [numeric](18, 1) NULL,
    [TEA_NcfQtd] [int] NULL,
    [PAT_Id] [int] NULL

Tarefa 的 DDL(重要的键 TRF_Id 和 SRV_Id(我需要它)):

CREATE TABLE [dbo].[Tarefa](
    **[TRF_Id] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,**
    **[SRV_Id] [int] NOT NULL,**
    [TRT_Id] [int] NOT NULL,
    [TRF_Descr] [varchar](255) NULL,
    [TRF_Entrada] [datetime] NOT NULL,
    [TRF_DoctosQtd] [int] NOT NULL,
    [TRF_Devolucao] [datetime] NULL,
    [TRF_NcfQtd] [int] NULL,
    [TRF_EhDocInsuf] [bit] NULL,
    [TRF_Observ] [varchar](255) NULL,
    [TRF_AreasTrfQtd] [int] NULL,
    [TRF_AreasTrfLiqQtd] [int] NULL

非常感谢。

编辑: 查询正确

基于@Gordon Linoff post:

select t.TEA_InicioTarefa, t.PFJ_Id_Analista, t.ATC_Id, t.SRV_Id
from (select t.*,  
             row_number() over (partition by ATC_Id, SRV_Id
                                order by TEA_InicioTarefa) as seqnum, ta.SRV_Id 
      from dbo.TarefaEtapaAreaTecnica t
      inner join dbo.Tarefa ta on t.TRF_Id = ta.TRF_Id
     ) t
where seqnum = 1 AND t.SRV_Id = 88

然后先得到分组,然后像

那样做一个JOIN
     SELECT 
            x.Min_TEA_InicioTarefa,
            t.PFJ_Id_Analista,
            t.ATC_Id, 
            t.SRV_Id
        FROM  
            dbo.TarefaEtapaAreaTecnica t
   INNER JOIN Tarefa ta ON ta.TRF_Id = t.TRF_Id
   INNER JOIN (
     select SRV_Id, MIN(TEA_InicioTarefa) as Min_TEA_InicioTarefa
      from dbo.TarefaEtapaAreaTecnica
      GROUP BY SRV_Id
     ) x ON t.SRV_Id = x.SRV_Id
   WHERE t.SRV_Id = 88  
   ORDER BY t.ATC_Id ASC;

只需使用window个函数:

select t.*
from (select t.*,
             row_number() over (partition by ATC_Id, SRV_Id
                                order by ini) as seqnum
      from dbo.TarefaEtapaAreaTecnica t
     ) t
where seqnum = 1;

这确实是过滤而非聚合的示例。问题是获取正确的过滤值。