0

我有一个包含以下条目的表格,并且在涉及日期时我正在努力分组。

  id    ref    startDate     
 ----  ----- -------------  
   1    001     01-01-2013       
   2    001     03-02-2013       
   3    002     31-01-2013       
   4    002     15-01-2013       
   5    001     05-06-2013 ....      

我想要做的是为每个参考选择前 2 个最大日期,所以我得到以下信息。

  id    ref    startDate     
 ----  ----- -------------  
   5    001     05-06-2013   
   2    001     03-02-2013       
   3    002     31-01-2013       
   4    002     15-01-2013  

我认为这意味着沿着..

SELECT *
FROM   TABLE a
JOIN   (SELECT startDate
        FROM   TABLE b
        JOIN   TABLE c
        ON     b.ref = c.ref AND b.startDate >= c.startDate
        GROUP BY ref) AS d
ON     a.ref = b.ref

我使用的是 SQL 2000,所以很遗憾分区是不可能的。

4

4 回答 4

1

只需将此子句(根据您的需要进行修改)放在查询中的某个位置,它应该只为您提供特定参考的前两个 StartDate。

WHERE b.StartDate IN 

(SELECT TOP 2 StartDate FROM b WHERE a.ref = b.ref ORDER BY StartDate DESC)

由于您JOIN似乎是您最初尝试过滤它的内容,因此将JOIN您拥有的内容替换为WHERE上述内容。确保您对其进行编辑,使其与您的实际表名匹配

于 2013-09-17T11:06:41.470 回答
0

我认为这可以满足您的需求(我知道这有点长,因为我们不能使用 CTE 或任何 Windows 功能)。

出于测试目的,我添加了一些额外的记录(same ref with duplicate startdatedifferent refs with same startdate),并进行了评论。

Sql 小提琴在这里

select min(id) id, t.ref, t.sdate
from t join (
     select ref, max(sdate) as sdate
     from t
     group by ref

     union

     select t.ref, max(t.sdate) as sdate
     from t join (
         select ref, max(sdate) as sdate
         from t
         group by ref
     ) t2 on t.ref = t2.ref and t.sdate < t2.sdate
     group by t.ref 
  ) x on t.ref = x.ref and t.sdate = x.sdate
group by t.ref, t.sdate 
order by t.ref, t.sdate desc
于 2013-09-17T12:04:12.187 回答
0

请检查这个

DECLARE @REF_TABLE AS TABLE(ID INT IDENTITY(1,1),REF VARCHAR(10))
DECLARE @LOOP_COUNT INT
DECLARE @ID INT=1
DECLARE @REF VARCHAR(10)
SELECT @LOOP_COUNT=COUNT(*) FROM @REF_TABLE
SELECT * INTO #TEMP FROM YOURTABLE WHERE 1=2
INSERT INTO @REF_TABLE SELECT DISTINCT REF FROM YOURTABLE
WHILE @LOOP_COUNT<@ID
BEGIN
SELECT @REF=REF FROM @REF_TABLE WHERE ID=@ID
INSERT INTO #TEMP SELECT TOP 2 * FROM YOURTABLE WHERE REF=@REF ORDER BY startDate DESC
SELECT @ID=@ID+1

END

SELECT * FROM #TEMP`
于 2013-09-17T11:06:40.467 回答
0

这是使用相关子查询的方法:

SELECT *
FROM TABLE t
WHERE (select count(*)
       from Table t2
       where t2.ref = t.ref and
             t2.date >= t.date
      ) <= 2;

这假定日期在每个组中是唯一的。

是一个显示它工作的 SQL Fiddle。

编辑:

如果日期不是唯一的,则可以对其进行修改以通过这种方式获取前两个日期的顶部行:

SELECT *
FROM TABLE t
WHERE (select count(distinct t2.date)
       from Table t2
       where t2.ref = t.ref and
             t2.date >= t.date
      ) <= 2;

或者,可以通过这种方式将其限制为恰好两行:

SELECT *
FROM TABLE t
WHERE (select count(*)
       from Table t2
       where t2.ref = t.ref and
             (t2.date > t.date or t2.date = t.date and t2.id <= t.id)
      ) <= 2;
于 2013-09-17T10:57:18.617 回答