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行或更多行的快速结果
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)
或者首先不使用表变量或临时表,并向数据来源的基表添加有用的索引.
归档时间: |
|
查看次数: |
8427 次 |
最近记录: |