我有一个名为myTbl的sql服务器表,如下所示:
BookID PageID textID Date Remarks
1 4 9 21-12-2017 1
2 5 10 15-12-2017 1
3 6 11 13-12-2017 1
4 7 12 11-12-2017 1
2 5 10 22-12-2017 1
4 7 12 18-12-2017 1
当BookID,PageID和textID具有相同的值时,我想对行进行分组,并根据最近的日期升序显示结果。例如第4和第6行以及第2和第5行。
我需要的是
BookID PageID textID Date Remarks
1 4 9 21-12-2017 1
2 5 10 15-12-2017 1
2 5 10 22-12-2017 1
3 6 11 13-12-2017 1
4 7 12 11-12-2017 1
4 7 12 18-12-2017 1
我要写的是:
SELECT *
FROM booksdb.dbo.books
GROUP BY BookID, PageID, textID Order by Date
我希望表中所有BookID,PageID,textID相同且按日期排列的列。
答案 0 :(得分:3)
您不需要group by
,因为查询中没有任何集合函数。
您可以尝试将RANK
与 window函数一起使用,使row_number然后按数字排序。
CREATE TABLE T (
BookID INT,
PageID INT,
textID INT,
DATE DATE,
Remarks INT
);
INSERT INTO T VALUES (1,4,9 ,'2017-12-21',1);
INSERT INTO T VALUES (2,5,10,'2017-12-15',1);
INSERT INTO T VALUES (2,5,10,'2017-12-22',1);
INSERT INTO T VALUES (3,6,11,'2017-12-13',1);
INSERT INTO T VALUES (4,7,12,'2017-12-11',1);
INSERT INTO T VALUES (4,7,12,'2017-12-18',1);
查询1 :
;WITH CTE AS (
SELECT *,RANK() OVER(PARTITION BY BookID, PageID, textID Order by Date) rn
FROM T
)
SELECT BookID,PageID,textID,[DATE],Remarks
FROM CTE
ORDER BY BookID, PageID, textID,rn
Results :
| BookID | PageID | textID | DATE | Remarks |
|--------|--------|--------|------------|---------|
| 1 | 4 | 9 | 2017-12-21 | 1 |
| 2 | 5 | 10 | 2017-12-15 | 1 |
| 2 | 5 | 10 | 2017-12-22 | 1 |
| 3 | 6 | 11 | 2017-12-13 | 1 |
| 4 | 7 | 12 | 2017-12-11 | 1 |
| 4 | 7 | 12 | 2017-12-18 | 1 |
答案 1 :(得分:2)
您似乎所需要的只是按照您提及的顺序依次ORDER BY
提及所有列。
SELECT *
FROM booksdb.dbo.books
ORDER BY bookid,
pageid,
textid,
date;
编辑:
注意:如果希望日期顺序显示最年轻的日期(例如,2017年11月12日之前的18-12-2017),而不是相反,请将ORDER BY
子句更改为:
ORDER BY bookid,
pageid,
textid,
date DESC;
(请注意DESC
之后的date
)。
期望的结果可能与您的描述相矛盾,总的来说,它们为这一点留下了解释的空间。