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

时间:2015-06-10 16:43:49

标签: sql select group-by

我在这里遇到一个我无法解决的简单问题,我有这样的疑问:

     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

它让我回答:

enter image description here

我能够将GROUP BY SRV_Id,ATC_Id,PFJ_Id_Analista分组给我这8条记录,但是你可以看到一些PFJ_Id_Analista不同。

我想要的只是选择每个SRV_Id和ATC_Id的早期日期,PFJ_Id_Analista不需要grup,如果我从查询的分组中删除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的帖子:

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

2 个答案:

答案 0 :(得分:1)

只需使用窗口功能:

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;

这实际上是过滤而不是聚合的示例。问题是获得正确的值来过滤。

答案 1 :(得分:0)

然后首先进行分组,然后使用

进行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;