使用两个分组键选择前1个记录

时间:2015-08-21 06:57:44

标签: sql-server

id日期值

1001 2015-06-01 A
1001 2015-06-30 B
1001 2015-07-10 C
1001 2015-07-11 D
1001 2015-08-01 E
1001 2015-08-15 F
1001 2015-08-20 G

所需的输出将是

1001 2015-06-30 6 B
1001 2015-07-11 7 D
1001 2015-08-20 8 G

我想仅针对每个id对每个月进行一次观察。

e.g。我在7月份有三条身份证1001的记录('2015-07-01','2015-07-10','2015-07-20')。因此我只需要'2015-07-20'记录。其他月份相似。

SELECT
 s.id,
 s.value,
 max(s.date) as [MaxDate],
 month(s.date) as [DateMonth]
FROM
 name s
WHERE
 s.date between '2015-06-01' and '2015-09-01'
GROUP BY
 s.id, month(s.date)

显示错误消息

  

在选择列表中无效,因为它不包含在任何一个中   聚合函数或GROUP BY子句。

当我使用函数Month()

时,似乎有问题

4 个答案:

答案 0 :(得分:2)

问题不在于功能。它带有值列。也可以在GROUP BY子句中使用值。

如果您确实需要没有GROUP BY的值列,请首先使用CTE获取带有ID和月份的select中的最大值。然后使用名称表加入ID和MONTH以获取值。

这样的事情:

    ;WITH   DateCTE AS     
(SELECT   s.id,
                 max(s.date) AS [MaxDate],
                 month(s.date) AS [DateMonth]
        FROM     name AS s
        WHERE    s.date BETWEEN '2015-06-01' AND '2015-09-01'
        GROUP BY s.id, month(s.date))
SELECT s.id,
       K.value,
       [MaxDate],
       [DateMonth]
FROM   DateCTE AS S
       INNER JOIN
       name AS K
       ON s.id = K.ID
          AND [MaxDate] = K.date;

让我知道它是否有效

答案 1 :(得分:1)

试试这个:

select 
  res.id,
  res.date,
  month(res.date) as [DateMonth],
  res.value 
from name res
INNER JOIN 
  (SELECT
    s.id,
    max(s.date) as [MaxDate],
    month(s.date) as [DateMonth]
  FROM
    name s
  WHERE
    s.date between '2015-06-01' and '2015-09-01'
  GROUP BY
    s.id, month(s.date)) a 
ON a.id = res.id AND a.MaxDate = res.date

答案 2 :(得分:1)

如果您的Sql Server版本支持.s-changes-new { color: #347C2C !important; } 功能,您可以尝试:

row_number

答案 3 :(得分:0)

您收到的错误是因为您未在s.value条款中添加Group by