如何过滤掉按日期分组的记录,日期差异较大

时间:2012-03-02 05:43:26

标签: sql sql-server

我有一些记录,按名称和日期分组。

我想在最近的记录中找到表格中的任何记录,这些记录的日期差异大于一周。

这可以用cte吗?

我正在思考这些问题(很难解释)

; with mycte as ( 
  select *
    from @GroupedRecords)
select *
  from mycte a
  join (select *
          from @GroupedRecords) b on a.Name = b.Name
 where datediff(day, a.DateCreated, b.DateCreated) > 7

例如:

Id  Name    Date
1   Foo     02/03/2010
2   Bar     23/02/2010
3   Ram     21/01/2010
4   Foo     29/02/2010
5   Foo     22/02/2010
6   Foo     05/12/2009

结果应该是:

Id  Name    Date
1   Foo     02/03/2010
5   Foo     22/02/2010
6   Foo     05/12/2009

2 个答案:

答案 0 :(得分:0)

您可以尝试:

SELECT id,
       name,
       DATE
FROM   groupedrecords AS gr1
WHERE  ( (SELECT MAX(DATE) AS md
          FROM   groupedrecords gr2
          WHERE  gr1.name = gr2.name) - gr1.DATE ) > 7;

或者可能更好:

SELECT id,
       name,
       DATE
FROM   groupedrecords AS gr1
       INNER JOIN (SELECT name,
                          MAX(DATE) AS md
                   FROM   groupedrecords AS gr2
                   GROUP  BY name) AS q1
         ON gr1.name = q1.name
WHERE  ( q1.md - gr1.DATE ) > 7;

更新:正如评论中所建议的,这是一个版本,它使用union来获取每组最大日期的ID以及7天或更早的最大日期的ID。我使用CTE来获得乐趣,没有必要。请注意,如果共享组中的最大日期的ID超过1个,则需要修改此查询 -

WITH CTE
     AS (SELECT name,
                Max(date) AS MD
         FROM   Records
         GROUP  BY name)

SELECT R.ID,
       R.name,
       R.date
FROM   CTE
       INNER JOIN Records AS R
         ON CTE.Name = R.Name
            AND CTE.MD = R.date
UNION ALL
SELECT r1.id,
       r1.name,
       r1.DATE
FROM   Records AS R1
       INNER JOIN CTE
         ON CTE.name = R1.name
WHERE  ( CTE.md - R1.DATE ) > 7
ORDER  BY name ASC,
          date DESC 

答案 1 :(得分:0)

我想知道这是否接近解决方案:

; with tableWithRow as (
  select *, row_number() over (order by name, date) as rowNum
  from t
)
select t1.*, t2.id t2id, t2.name t2name, t2.date t2date, t2.rowNum t2rowNum
from tableWithRow t1
join tableWithRow t2
on t1.rowNum = t2.rowNum + 1 and t1.name = t2.name