SQL group by 1列但包括其他列的TOP 1

时间:2015-03-24 20:45:03

标签: sql sql-server tsql group-by

我正在尝试构建一个SQL查询,其中我按1列分组,但随后还包括每个组中任意记录的其他列的值。所以,像

SELECT BoxNo 
FROM MuffinData 
WHERE FrostingTimeApplied >= CONVERT(date, GETDATE()) 
GROUP BY BoxNo

但是在结果中包含了MuffinType列,FrostingType列中的一些值(我知道每个框只有MuffinTypeFrostingType的值。)< / p>

4 个答案:

答案 0 :(得分:1)

您必须为所选的每个列使用一个聚合函数,该函数在GROUP BY子句中不存在:

SELECT BoxNo, MAX(MuffinType) AS  MuffinType, MAX(FrostingType) AS FrostingType
FROM MuffinData 
WHERE FrostingTimeApplied >= CONVERT(date, GETDATE()) 
GROUP BY BoxNo

如果每个框只有MuffinTypeFrostingType的值,则在上述查询中将选择每个框中的这些唯一值no。

答案 1 :(得分:1)

  

我知道MuffinType和FrostingType只有1个值   每盒

如果情况确实如此,那么简单的DISTINCT就应该这样做:

SELECT DISTINCT BoxNo, MuffinType, FrostingType
FROM MuffinData 
WHERE FrostingTimeApplied >= CONVERT(date, GETDATE());

如果情况并非如此,那么您正在处理通常称为每组前N 问题的问题。您可以找到问题的覆盖范围和建议的解决方案here

干杯, 伊茨克

答案 2 :(得分:0)

如果您按任何方式进行分组,那么在单个语句中执行此操作的唯一方法(我知道)是让您返回的其他列是聚合函数的结果。聚合函数是任何采用多个值但返回单个结果的函数,如:SUM,MAX,MIN,COUNT等......

SELECT BoxNo, COUNT(MuffinData.ID), MAX(FrostingType.FlavorID) FROM MuffinData, FrostingType etc...

您可能需要调整WHERE逻辑或在FROM列表(子查询)中使用其他数据源。

答案 3 :(得分:0)

您可以使用CTE并连接回原始表格以获取所需的字段。在这种情况下,

WITH BoxGroup AS (SELECT BoxNo FROM MuffinData WHERE FrostingTimeApplied >= CONVERT(date, GETDATE()) GROUP BY BoxNo) SELECT md.BoxNo,md.MuffinType,md.FrostingType FROM MuffinData md INNER JOIN BoxGroup bg ON bg.BoxNo = md.BoxNo