0

というテーブルと'@DeviceSample'、という別のテーブルがあるとします。'@DevicesActivityDataSample'.

'MAX(DATETIME)'各デバイスの上位 1 つのFROMを選択したいのです'@DevicesActivityDataSample'が、「DevicesActivityDataSample」で重複した行があった場合、結果ではすべての重複した行を取得しますが、上位の行を探しています。もう1つの問題は、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

および1000000行以上の高速高速結果を取得するにはどうすればよいですか

4

2 に答える 2

5
SELECT DeviceID, MAX(DeviceDateTime)
FROM @DeviceSample
GROUP BY DeviceID;

これが遅い場合は、@table 変数の代わりに #temp テーブルを使用することを検討し (主な違いはこちらを参照)、次のようなインデックスを追加します。

CREATE CLUSTERED INDEX LatestDeviceTime
  ON #DeviceSample (DeviceID, DeviceDateTime DESC);

または、そもそもテーブル変数または一時テーブルを使用せず、データの取得元のベース テーブルに有用なインデックスを追加します。

于 2013-02-16T05:12:26.023 に答える
3

これは、グループ クエリごとに最大の n です。テーブル変数の定義を次のように変更します

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

便利なインデックスを追加します。

方法 1

SELECT DADS.*
FROM   @DeviceSample DS
       CROSS APPLY (SELECT TOP 1 *
                    FROM   @DevicesActivityDataSample DADS
                    WHERE  DADS.BDeviceID = DS.ADeviceID
                    ORDER  BY DADS.DeviceDateTime DESC) DADS;

方法 2

WITH T
     AS (SELECT *,
                ROW_NUMBER() OVER (PARTITION BY BDeviceID 
                                       ORDER BY DeviceDateTime DESC) AS RN
         FROM   @DevicesActivityDataSample)
SELECT *
FROM   T
WHERE  RN = 1 

予定

#temp@Aaron がおそらく次の定義で提案しているように、テーブルの使用を検討することもできます。

CREATE TABLE #DevicesActivityDataSample (
  RowID          INT IDENTITY(1, 1) PRIMARY KEY NONCLUSTERED,
  BDeviceID      INT,
  DeviceDateTime DATETIME,
  CMD            NVARCHAR(50)) 

CREATE CLUSTERED INDEX IX ON #DevicesActivityDataSample(BDeviceID, DeviceDateTime DESC) 

本当に必要RowIDですか?

于 2013-02-16T09:36:12.043 に答える