Sql server 在sql server中按月按日提取数据

Sql server 在sql server中按月按日提取数据,sql-server,Sql Server,我有一个带有createdDate列的表任务。我需要获得在特定月份创建的所有任务,并且每天的记录不应超过4条。如果在一个特定日期有超过4条记录,那么我们只能得到最先装箱的前4条记录。还有一个列CreatedTime Task ( id ,CreatedDate ,CreatedTime ) 结果应该是 id CreatedDate 1 1/1/2013 2 1/1/2013 3 1/1/2013 4 1/1/

我有一个带有createdDate列的表任务。我需要获得在特定月份创建的所有任务,并且每天的记录不应超过4条。如果在一个特定日期有超过4条记录,那么我们只能得到最先装箱的前4条记录。还有一个列CreatedTime

Task
(
  id
  ,CreatedDate
  ,CreatedTime

)
结果应该是

id      CreatedDate

1       1/1/2013  
2       1/1/2013  
3       1/1/2013  
4       1/1/2013  
5       1/2/2013  
6       1/2/2013  
7       1/2/2013  
8       1/2/2013  
在子查询或公共表表达式CTE中使用行号。子查询版本:

SELECT
    * --TODO: Columns
FROM
    (SELECT
        *,ROW_NUMBER() OVER (PARTITION BY CreatedDate ORDER BY CreatedTime) as rn
     FROM
        Task
    ) t
WHERE
    rn between 1 and 4
如果您的数据中可能存在两行在同一天具有相同CreatedTime的关联,并且您需要明确考虑这些关联,则可以根据需要将行数与秩或密集秩交换

; WITH A AS (
SELECT ID, CreatedDate
, convert(VARCHAR(7), CreatedDate, 121) AS YearMonth --will return something like 2012-01 
FROM Task
), 
B AS (
SELECT ID, CreatedDate
, ROW_NUMBER() OVER (PARTITION BY YearMonth ORDER BY CreatedDate, ID) AS RowNum
FROM A)
SELECT ID, CreatedDate
FROM B
WHERE RowNum<=4
ORDER BY ID
这适用于SQL 2005及更高版本

首先在CTE A中,您可以找到分区列YearMonth, 然后在B中为每条记录分配一个RowNum,这可以根据您的排序citeria进行更改 然后你得到最后的结果。
谢谢你的回复。我在这里做了一些改变并得到了解决方案

; WITH A 
AS 
(
SELECT ID, CreatedDate , DAY(CreatedDate) AS Day 
FROM Task
WHERE CreatedDate BETWEEN '01/01/2013 00:00:00' AND '01/31/2013 23:59:59' 
)
,
B AS 
(
    SELECT 
     ROW_NUMBER() OVER (PARTITION BY Day ORDER BY CreatedDate, ID) AS RowNum 
    ,*
    FROM A
)


select 
 DAY(CreatedDate) as Day1
, MONTH(CreatedDate) as Month
, YEAR(dueDate) as Year
, * 
from B 
WHERE RowNum <= 4
order by Year,Month,Day1, CreatedDate

谢谢你的回复。我在这里做了一些更改并获得了解决方案。是的,在上午10点之前回复了此问题:。现在我知道你每天都想要第一个结果。如果你皈依了Varchar10,你就有一整天没有时间了,你就可以去了。