Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL在分组查询上添加额外字段_Sql_Sql Server_Tsql - Fatal编程技术网

SQL在分组查询上添加额外字段

SQL在分组查询上添加额外字段,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个工作查询来提取Tempi表中每个运动员在每段距离内的最短时间。这是一个简单的分组查询,按athleteID和distanceID对结果进行分组,并选择最短时间。但我现在需要知道何时何地获得这一时间。这些数据位于另一个名为Manif的表中。这两个表由ManifID连接,ManifID出现在两个表中。如何检索日期和时间所在城市? 谢谢 工作查询 SELECT [02_tEMPI].CodSpec, [04_Spec].DescrSpecShort, Min([0

我有一个工作查询来提取Tempi表中每个运动员在每段距离内的最短时间。这是一个简单的分组查询,按athleteID和distanceID对结果进行分组,并选择最短时间。但我现在需要知道何时何地获得这一时间。这些数据位于另一个名为Manif的表中。这两个表由ManifID连接,ManifID出现在两个表中。如何检索日期和时间所在城市? 谢谢

工作查询

SELECT 
    [02_tEMPI].CodSpec, 
    [04_Spec].DescrSpecShort, 
    Min([02_Tempi].Tempo) AS MinDiTempo
FROM  
    [04_Spec] 
    INNER JOIN [03_Manif] 
    INNER JOIN [02_Tempi] 
        ON [03_Manif].IDManif = [02_Tempi].CodManif 
        ON [04_Spec].CodSpec = [02_Tempi].CodSpec
WHERE 
    [02_Tempi].CodAtleta=@CodAtleta AND 
    [03_Manif].Base = @Base 
GROUP BY 
    [04_Spec].DescrSpecShort,
    [02_Tempi].CodSpec
HAVING 
    [02_Tempi].CodSpec <'60'
ORDER BY 
    [02_Tempi].CodSpec
mANIF表结构

CREATE TABLE [dbo].[03_Manif] (
    [IDManif]    INT           NOT NULL,
    [DescrManif] VARCHAR (100) NULL,
    [LuogoManif] VARCHAR (50)  NULL,
    [Base]       SMALLINT      NULL,
    [LinkPDF]    VARCHAR (250) NULL,
    [Data]       VARCHAR (10)  NULL,
    CONSTRAINT [PK__03_Manif] PRIMARY KEY CLUSTERED ([IDManif] ASC)
);
谢谢

这是一种潜在的方法

选择您的最短时间,按athleteID和distanceID分组 交叉应用该结果到这3个字段上的Tempi表中,以从原始Tempi记录中获取ManifID,如果可能有多个结果,请按一定顺序选择1。 使用ManifID连接到您的Manif表

SELECT 
    Min(T1.Tempo) [Fastest Tempo],
    T1.AthleteID, 
    T1.DistanceID,
    SUBT.ManifID
FROM [02_Tempi] T1
CROSS APPLY
    (
        SELECT TOP 1 T2.ManifID
        FROM [02_Tempi] T2
        WHERE T2.AthleteID = T1.AthleteID
            AND T2.DistanceID = T1.DistanceID
        ORDER BY T2.Tempo DESC --add other differentiating columns if necessary
    ) SUBT
JOIN [03_Manif] M
    ON SUBT1.ManifID = M.ManifID
GROUP BY 
    T1.AthleteID, 
    T1.DistanceID,
    SUBT.ManifID
我认为您可以执行以下行数窗口功能:

;
WITH    cte
          AS ( SELECT   * ,
                        ROW_NUMBER() OVER ( PARTITION BY [04_Spec].DescrSpecShort,
                                [02_Tempi].CodSpec ORDER BY [02_Tempi].Tempo ) AS rn
               FROM     [04_Spec]
                        INNER JOIN [02_Tempi] ON [04_Spec].CodSpec = [02_Tempi].CodSpec
                        INNER JOIN [03_Manif] ON [03_Manif].IDManif = [02_Tempi].CodManif
               WHERE    [02_Tempi].CodAtleta = @CodAtleta
                        AND [03_Manif].Base = @Base
                        AND [02_Tempi].CodSpec < '60'
             )
    SELECT  *
    FROM    cte
    WHERE   rn = 1

达里奥,欢迎来到堆栈溢出!感谢您花时间写下如此详细的第一个问题,并在本文中包含了如此多的相关信息。您能否编辑您的问题,以表明您数据库的RDBMS和版本,例如SQL Server 2012、MySQL、Oracle 9等?一些最好的方法是特定于版本的。若要编辑,请在帖子底部附近查找灰色的“edit”一词。根据提供的语法添加了sql server标记。我注意到CodSpec是varchar,因此警告比较<'60'可能不会像您假设的那样起作用,因为'100'会匹配,而'9'不会匹配,因为比较是按字母顺序进行的,而不是数字。您好,James。谢谢你的信息。CodSpec始终是一个2位数字字符串,从“00”到“84”。您好,Giorgi。谢谢你的解决方案。我有一个错误:Msg 8156,16级,状态1,第1行,列“CodSpec”被多次指定为“cte”。在cte中,用列名替换*并为它们别名。子查询不能返回多个同名列。谢谢!工作完美!
;
WITH    cte
          AS ( SELECT   * ,
                        ROW_NUMBER() OVER ( PARTITION BY [04_Spec].DescrSpecShort,
                                [02_Tempi].CodSpec ORDER BY [02_Tempi].Tempo ) AS rn
               FROM     [04_Spec]
                        INNER JOIN [02_Tempi] ON [04_Spec].CodSpec = [02_Tempi].CodSpec
                        INNER JOIN [03_Manif] ON [03_Manif].IDManif = [02_Tempi].CodManif
               WHERE    [02_Tempi].CodAtleta = @CodAtleta
                        AND [03_Manif].Base = @Base
                        AND [02_Tempi].CodSpec < '60'
             )
    SELECT  *
    FROM    cte
    WHERE   rn = 1