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