2

我需要在 SQL 中解决以下问题。

假设我有一个包含 2 列的表:

    Date | Code
    --------
    0    | 25
    1    | 22
    2    | 23
    3    | 25
    4    | 23
    5    | 21

而且我需要对它们进行计数,因为日期与我相关。所以,假设我需要制作这样的东西:

    Date | Code | Count
    --------------------
    0    | 25   |   1
    1    | 22   |   1
    2    | 23   |   1
    3    | 25   |   2
    4    | 23   |   2
    5    | 21   |   1

提前致谢,

PS:我在 MSSQL 2012 中实现它。

问候。

4

3 回答 3

4

最简单(可能也是最有效)的方法是使用ROW_NUMBER()

SELECT [Date], Code, [Count] = ROW_NUMBER() OVER (PARTITION BY Code ORDER BY [Date])
 FROM dbo.YourTableName
 ORDER BY [Date];

为了好玩,你也可以在 SQL Server 2012 中这样解决。如果Date是唯一的:

SELECT [Date], Code, [Count] = COUNT(*) OVER (PARTITION BY Code ORDER BY [Date]
  RANGE UNBOUNDED PRECEDING)
 FROM dbo.YourTable
 ORDER BY [Date];

或者更简单地说:

SELECT [Date], Code, [Count] = COUNT(*) OVER (PARTITION BY Code ORDER BY [Date])
 FROM dbo.YourTable
 ORDER BY [Date];

如果Date不是唯一的,并且如果您不想要关系(日期+代码的相同组合的计数相同),则需要使用更昂贵的ROWS,它在磁盘假脱机上使用:

SELECT [Date], Code, [Count] = COUNT(*) OVER (PARTITION BY Code ORDER BY [Date]
  ROWS UNBOUNDED PRECEDING)
 FROM dbo.YourTable
 ORDER BY [Date];

您可能想在您的桌子上尝试这些选项中的每一个,看看性能如何。

于 2013-04-04T17:15:00.260 回答
0

看起来您想要代码值的运行计数。如果是这样,那么您可以使用以下查询来获取运行计数:

SELECT date,
  code, 
  (SELECT count(code)
   FROM yourtable b 
   WHERE b.date <= a.date
     and a.code = b.code) AS TotalCount
FROM yourtable a

请参阅带有演示的 SQL Fiddle

或者您可以使用:

SELECT a.date,
  a.code, 
  count(a.code) AS TotalCount
FROM yourtable a
cross join yourtable b
WHERE b.date <= a.date
  and a.code = b.code
group by a.date, a.code
order by a.date;

请参阅带有演示的 SQL Fiddle

请注意,这在较小的表上可以正常工作,但在较大的表上会出现问题。(感谢@AaronBertrand)

于 2013-04-04T17:09:04.267 回答
0

如果我理解正确,您想添加额外的列,告诉您该代码发生了多少次。

select *, 
COUNT(1) over (partition by Code) 
from Table
于 2013-04-04T17:12:43.997 回答