SELECT TOP 1 MAX(DATETIME)

aka*_*aco 0 sql sql-server select

假设我有一个名为的表'@DeviceSample'和另一个名为的表'@DevicesActivityDataSample'.

我想为每个设备选择前1个'MAX(DATETIME)'FROM '@DevicesActivityDataSample'但是当我有重复的行时在'DevicesActivityDataSample'在我的结果中我得到所有重复的行,但我寻找前一个.另一个问题是当我想要从100000行中选择时需要很长时间才能得到我的结果因为计算MAX这是我的示例代码

DECLARE @DeviceSample TABLE
(
RowID INT IDENTITY(1, 1) PRIMARY KEY CLUSTERED,
ADeviceID INT ,
DeviceName VARCHAR(50) NOT NULL
) 
INSERT @DeviceSample
SELECT 1,'DEVICE 1' UNION ALL
SELECT 2,'DEVICE 2' UNION ALL
SELECT 3,'DEVICE 3'



DECLARE @DevicesActivityDataSample TABLE
(
RowID INT IDENTITY(1, 1) PRIMARY KEY CLUSTERED,
BDeviceID INT,
DeviceDateTime DATETIME,
CMD NVARCHAR(50)
) 

INSERT @DevicesActivityDataSample
SELECT 1, '2013-02-14 19:08:46.000','HHJJ' UNION ALL
SELECT 2, '2013-02-15 03:30:24.000','HHJJ' UNION ALL
SELECT 2, '2013-02-15 03:30:24.000','HHJJ' UNION ALL
SELECT 2, '2013-02-15 03:30:24.000','HHJJ' UNION ALL
SELECT 1, '2013-02-16 03:30:24.000','HHJJ' UNION ALL
SELECT 1, '2013-02-11 03:30:24.000','HHJJ' UNION ALL
SELECT 2, '2013-02-10 03:30:24.000','HHJJ' UNION ALL
SELECT 3, '2013-02-07 04:25:24.000','HHJJ' UNION ALL
SELECT 3, '2013-02-12 23:02:02.000','HHJJ' 



    SELECT  *
    FROM        @DeviceSample
    INNER JOIN  
    @DevicesActivityDataSample 
            ON  ADeviceID = BDeviceID
    WHERE       DeviceDateTime IN (
                    SELECT    MAX(DeviceDateTime) AS MaxDate
                    FROM      @DevicesActivityDataSample                                
                    GROUP BY  BDeviceID
                ) 

GO
Run Code Online (Sandbox Code Playgroud)

以及如何快速获得1000000行或更多行的快速结果

Aar*_*and 5

SELECT DeviceID, MAX(DeviceDateTime)
FROM @DeviceSample
GROUP BY DeviceID;
Run Code Online (Sandbox Code Playgroud)

如果这很慢,那么考虑使用#temp表而不是@table变量(请参阅此处的主要差异),并添加如下索引:

CREATE CLUSTERED INDEX LatestDeviceTime
  ON #DeviceSample (DeviceID, DeviceDateTime DESC);
Run Code Online (Sandbox Code Playgroud)

或者首先不使用表变量或临时表,并向数据来源的基表添加有用的索引.