【问题标题】:Selecting Top/Last and Position number Order By with all columns选择 Top/Last 和 Position 编号 Order By 以及所有列
【发布时间】:2021-07-18 01:01:24
【问题描述】:

关注这个问题Selecting the first N rows of each group ordered by date

USE [Test]

CREATE TABLE [dbo].[Masters] 
(
    [MasterId] [nchar](36) NOT NULL PRIMARY KEY,
    [Tags] [nchar](100) NULL,
    [Numbers] [int] NOT NULL
);

CREATE TABLE [dbo].[Details] 
(
    [DetailId] [nchar](36) NOT NULL PRIMARY KEY,
    [MasterId] [nchar](36) FOREIGN KEY REFERENCES Masters(MasterId),
    [Date_Time] [datetime2](7) NOT NULL,
    [Value] [int] NOT NULL
);


INSERT INTO Masters (MasterId, Tags, Numbers) VALUES ('M0', 'Tag0,Tag1', 6);
INSERT INTO Masters (MasterId, Tags, Numbers) VALUES ('M1', 'Tag1,Tag2', 5);
INSERT INTO Masters (MasterId, Tags, Numbers) VALUES ('M2', 'Tag0,Tag2', 6);

INSERT INTO Details (DetailId, MasterId, Date_Time, Value) VALUES ('D0', 'M0', '20190101 00:30:00 AM', 0);
INSERT INTO Details (DetailId, MasterId, Date_Time, Value) VALUES ('D1', 'M0', '20200101 11:00:00 AM', 1);
INSERT INTO Details (DetailId, MasterId, Date_Time, Value) VALUES ('D2', 'M0', '20200701 01:00:00 AM', 2);
INSERT INTO Details (DetailId, MasterId, Date_Time, Value) VALUES ('D3', 'M0', '20210715 10:00:00 AM', 3);
INSERT INTO Details (DetailId, MasterId, Date_Time, Value) VALUES ('D4', 'M0', '20210715 11:30:00 AM', 4);
INSERT INTO Details (DetailId, MasterId, Date_Time, Value) VALUES ('D5', 'M0', '20210715 11:00:00 AM', 5);

INSERT INTO Details (DetailId, MasterId, Date_Time, Value) VALUES ('D10', 'M1', '20190101 00:20:00 AM', 6);
INSERT INTO Details (DetailId, MasterId, Date_Time, Value) VALUES ('D11', 'M1', '20200101 01:00:00 AM', 7);
INSERT INTO Details (DetailId, MasterId, Date_Time, Value) VALUES ('D12', 'M1', '20200701 09:00:00 AM', 8);
INSERT INTO Details (DetailId, MasterId, Date_Time, Value) VALUES ('D13', 'M1', '20210101 10:00:00 AM', 9);
INSERT INTO Details (DetailId, MasterId, Date_Time, Value) VALUES ('D14', 'M1', '20210701 10:00:00 AM', 10);

INSERT INTO Details (DetailId, MasterId, Date_Time, Value) VALUES ('D20', 'M2', '20190101 00:00:00 AM', 11);
INSERT INTO Details (DetailId, MasterId, Date_Time, Value) VALUES ('D21', 'M2', '20190101 01:30:00 AM', 12);
INSERT INTO Details (DetailId, MasterId, Date_Time, Value) VALUES ('D22', 'M2', '20200101 01:30:00 AM', 13);
INSERT INTO Details (DetailId, MasterId, Date_Time, Value) VALUES ('D23', 'M2', '20200701 08:30:00 AM', 14);
INSERT INTO Details (DetailId, MasterId, Date_Time, Value) VALUES ('D24', 'M2', '20210101 01:30:00 AM', 15);
INSERT INTO Details (DetailId, MasterId, Date_Time, Value) VALUES ('D25', 'M2', '20210701 01:30:00 AM', 16);

这里是一个简单的输出

SELECT d.* 
FROM Details AS d 
ORDER BY d.Date_Time DESC;

输出:

D4  M0  2021-07-15 11:30:00.0000000 4
D5  M0  2021-07-15 11:00:00.0000000 5
D3  M0  2021-07-15 10:00:00.0000000 3
D14 M1  2021-07-01 10:00:00.0000000 10
D25 M2  2021-07-01 01:30:00.0000000 16
D13 M1  2021-01-01 10:00:00.0000000 9
D24 M2  2021-01-01 01:30:00.0000000 15
D12 M1  2020-07-01 09:00:00.0000000 8
D23 M2  2020-07-01 08:30:00.0000000 14
D2  M0  2020-07-01 01:00:00.0000000 2
D1  M0  2020-01-01 11:00:00.0000000 1
D22 M2  2020-01-01 01:30:00.0000000 13
D11 M1  2020-01-01 01:00:00.0000000 7
D21 M2  2019-01-01 01:30:00.0000000 12
D0  M0  2019-01-01 00:30:00.0000000 0
D10 M1  2019-01-01 00:20:00.0000000 6
D20 M2  2019-01-01 00:00:00.0000000 11

现在,我想要最后几行,包括它的位置(13、14、15、16 和 17)。

13  D11 M1  2020-01-01 01:00:00.0000000 7
14  D21 M2  2019-01-01 01:30:00.0000000 12
15  D0  M0  2019-01-01 00:30:00.0000000 0
16  D10 M1  2019-01-01 00:20:00.0000000 6
17  D20 M2  2019-01-01 00:00:00.0000000 11

对具有位置行的行的查询是什么?

我正在尝试(我知道这很糟糕!)

SELECT TOP(5) 
    COUNT(Date_Time), * 
FROM 
    Details 
GROUP BY 
    COUNT(Date_Time) 
ORDER BY 
    COUNT(Date_Time) DESC;

【问题讨论】:

  • 数据中有很多重复的Date_Time值。如果您想要一个可重复的结果,您需要在 order by 子句中添加更多的列,而不仅仅是 Date_Time
  • 根据问题指南,请不要发布代码、数据、错误消息等的图像 - 复制或键入问题中的文本。请保留将图像用于图表或演示渲染错误,无法通过文本准确描述的事情。

标签: sql-server group-by count sql-order-by sql-limit


【解决方案1】:

检查:

SELECT * FROM
    (SELECT Top(5) ROW_NUMBER() OVER(ORDER BY d.Date_Time DESC) AS position, d.* 
        FROM Details AS d 
        ORDER BY d.Date_Time ASC
    ) AS d2 ORDER BY d2.Date_Time DESC;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    • 2011-04-10
    • 2017-05-09
    • 1970-01-01
    相关资源
    最近更新 更多