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()
答案 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
。