如何选择多列具有相同值的行

时间:2018-08-17 21:03:40

标签: sql sql-server database

我有一个名为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相同且按日期排列的列。

2 个答案:

答案 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)。

期望的结果可能与您的描述相矛盾,总的来说,它们为这一点留下了解释的空间。