2017-06-28 3 views
1

ある場合:和データ日付範囲が、私はこのような2つのクエリの結果持っているSQL Serverで別のテーブルに

enter image description here

table 2

を私はこの2つのクエリを使用したいと思いますし、その後その特定のデバイス(この場合は43)が、その期間の最初のテーブルの日付範囲で左右の日付制限を使用して接続されていれば、2番目のテーブルの秒数をSUMします(この場合はMain - Charging)。したがって、その条件が満たされている場合のみSUM。

私はこれをどのように達成することができますか?

これは、テーブル・スクリプトといくつかのサンプルデータです:

まずテーブル・スクリプト:

CREATE TABLE firstTable(
    DeviceId  INTEGER NOT NULL 
    ,Date   DATE NOT NULL 
    ,DisplayValue VARCHAR(16) NOT NULL 
    ,LeftLimit DATETIME NOT NULL 
    ,RigthLimit DATETIME NOT NULL 
    ,Seconds  INTEGER NOT NULL 
); 
INSERT INTO firstTable(DeviceId,Date,DisplayValue,LeftLimit,RigthLimit,Seconds) VALUES (43,'2017-06-27','Connected','2017-06-27 00:00:00.000','2017-06-27 10:17:54.460',37074); 
INSERT INTO firstTable(DeviceId,Date,DisplayValue,LeftLimit,RigthLimit,Seconds) VALUES (43,'2017-06-27','Connected','2017-06-27 10:17:54.460','2017-06-27 10:17:56.293',2); 
INSERT INTO firstTable(DeviceId,Date,DisplayValue,LeftLimit,RigthLimit,Seconds) VALUES (43,'2017-06-27','Connected','2017-06-27 10:17:56.293','2017-06-27 10:17:56.330',0); 
INSERT INTO firstTable(DeviceId,Date,DisplayValue,LeftLimit,RigthLimit,Seconds) VALUES (43,'2017-06-27','Connected','2017-06-27 10:17:56.330','2017-06-27 10:17:57.430',1); 
INSERT INTO firstTable(DeviceId,Date,DisplayValue,LeftLimit,RigthLimit,Seconds) VALUES (43,'2017-06-27','Connected','2017-06-27 10:17:57.430','2017-06-27 10:17:57.440',0); 
INSERT INTO firstTable(DeviceId,Date,DisplayValue,LeftLimit,RigthLimit,Seconds) VALUES (43,'2017-06-27','Connected','2017-06-27 10:17:57.440','2017-06-27 10:17:58.637',1); 
INSERT INTO firstTable(DeviceId,Date,DisplayValue,LeftLimit,RigthLimit,Seconds) VALUES (43,'2017-06-27','Connected','2017-06-27 10:17:58.637','2017-06-27 10:17:58.783',0); 
INSERT INTO firstTable(DeviceId,Date,DisplayValue,LeftLimit,RigthLimit,Seconds) VALUES (43,'2017-06-27','Connected','2017-06-27 10:17:58.783','2017-06-27 10:17:59.657',1); 
INSERT INTO firstTable(DeviceId,Date,DisplayValue,LeftLimit,RigthLimit,Seconds) VALUES (43,'2017-06-27','Connected','2017-06-27 10:17:59.657','2017-06-27 10:17:59.903',0); 
INSERT INTO firstTable(DeviceId,Date,DisplayValue,LeftLimit,RigthLimit,Seconds) VALUES (43,'2017-06-27','Connected','2017-06-27 10:17:59.903','2017-06-27 10:18:00.977',1); 
INSERT INTO firstTable(DeviceId,Date,DisplayValue,LeftLimit,RigthLimit,Seconds) VALUES (43,'2017-06-27','Connected','2017-06-27 10:18:00.977','2017-06-27 10:18:01.027',1); 
INSERT INTO firstTable(DeviceId,Date,DisplayValue,LeftLimit,RigthLimit,Seconds) VALUES (43,'2017-06-27','Connected','2017-06-27 10:18:01.027','2017-06-27 10:18:01.517',0); 

セカンドテーブル・スクリプト:

CREATE TABLE secondTable(
    DeviceId  INTEGER NOT NULL 
    ,Date   DATE NOT NULL 
    ,DisplayValue VARCHAR(16) NOT NULL 
    ,LeftLimit DATETIME NOT NULL 
    ,RigthLimit DATETIME NOT NULL 
    ,Seconds  INTEGER NOT NULL 
); 
INSERT INTO secondTable(DeviceId,Date,DisplayValue,LeftLimit,RigthLimit,Seconds) VALUES (43,'2017-06-27','Mains - Charging','2017-06-27 00:00:00.000','2017-06-27 10:17:57.523',37077); 
INSERT INTO secondTable(DeviceId,Date,DisplayValue,LeftLimit,RigthLimit,Seconds) VALUES (43,'2017-06-27','Mains - Charging','2017-06-27 10:17:57.523','2017-06-27 10:17:59.883',2); 
INSERT INTO secondTable(DeviceId,Date,DisplayValue,LeftLimit,RigthLimit,Seconds) VALUES (43,'2017-06-27','Mains - Charging','2017-06-27 10:17:59.883','2017-06-27 10:17:59.953',0); 
INSERT INTO secondTable(DeviceId,Date,DisplayValue,LeftLimit,RigthLimit,Seconds) VALUES (43,'2017-06-27','Mains - Charging','2017-06-27 10:17:59.953','2017-06-27 10:18:01.043',2); 
INSERT INTO secondTable(DeviceId,Date,DisplayValue,LeftLimit,RigthLimit,Seconds) VALUES (43,'2017-06-27','Mains - Charging','2017-06-27 10:18:01.043','2017-06-27 10:18:01.103',0); 
INSERT INTO secondTable(DeviceId,Date,DisplayValue,LeftLimit,RigthLimit,Seconds) VALUES (43,'2017-06-27','Mains - Charging','2017-06-27 10:18:01.103','2017-06-27 10:18:01.553',0); 
INSERT INTO secondTable(DeviceId,Date,DisplayValue,LeftLimit,RigthLimit,Seconds) VALUES (43,'2017-06-27','Mains - Charging','2017-06-27 10:18:01.553','2017-06-27 10:18:01.630',0); 

期待される結果:

CREATE TABLE expectedResult(
    DeviceId  INTEGER NOT NULL 
    ,LeftLimit DATETIME NOT NULL 
    ,RigthLimit DATETIME NOT NULL 
    ,TotalSeconds INTEGER NOT NULL 
); 
INSERT INTO expectedResult(DeviceId,LeftLimit,RigthLimit,TotalSeconds) VALUES (43,'2017-06-27 00:00:00.000','2017-06-27 10:18:02.630',37081); 

期待される再SULT表:

+----------+-------------------------+-------------------------+--------------+ 
| DeviceId |  LeftLimit  |  RightLimit  | TotalSeconds | 
+----------+-------------------------+-------------------------+--------------+ 
|  43 | 2017-06-27 00:00:00.000 | 2017-06-27 10:18:02.630 |  37081 | 
+----------+-------------------------+-------------------------+--------------+ 
+1

言葉で...ハァッ??? –

+0

@SeanLange IE:例えば、00:00〜10:18:01:517デバイス43が「接続済み」だったためです。時間間隔が最初のテーブルの間隔の場合は、2番目のテーブルから「秒」を合計します。だから私は2番目のテーブルからレコード1,2,3,4,5,6を合計します。 – legollas007

+2

あなたがここでやろうとしていることはまったく明確ではありません。ここでは、この質問の改善を開始するのに最適な場所です。 https://spaghettidba.com/2015/04/24/how-to-post-a-t-sql-question-on-a-public-forum/ –

答えて

1
SELECT DISTINCT 
ST.[DeviceId], 
MIN(CASE WHEN FT.[LeftLimit] > ST.[LeftLimit] THEN FT.[LeftLimit] ELSE ST.[LeftLimit] END) AS [LeftLimit], 
MAX(CASE WHEN FT.[RigthLimit] < ST.[RigthLimit] THEN FT.[RigthLimit] ELSE ST.[RigthLimit] END) AS [RigthLimit], 
SUM(DATEDIFF(
    SECOND, 
    CASE WHEN FT.[LeftLimit] > ST.[LeftLimit] THEN FT.[LeftLimit] ELSE ST.[LeftLimit] END, 
    CASE WHEN FT.[RigthLimit] < ST.[RigthLimit] THEN FT.[RigthLimit] ELSE ST.[RigthLimit] END)) AS [TotalSeconds] 
FROM firstTable FT 
INNER JOIN secondTable ST ON ST.[DeviceId] = FT.[DeviceId] AND (FT.[LeftLimit] <= ST.[RigthLimit] AND ST.[LeftLimit] <= FT.[RigthLimit]) 
GROUP BY ST.[DeviceId] 

第2のテーブルの最初のテーブルは、日付範囲が重複する場所にのみ結合します。次に、最小左と最大右の限界と合計を取る。

+0

ありがとう!それはまさに私が探していたものでした。 – legollas007

0

は1テーブルからMAX RightLimit未満である第2のテーブルから第1のテーブルからMIN LeftLimitよりも大きい第2のテーブルからLeftLimit ON 2つのテーブルをJOIN、AND RightLimit。もちろん、DeviceIdでも。

また、すべての制限列を日付比較としてCASTする必要があります。

+0

ON句に集約を含めることはできません。また、私はこれが期待される結果を出力しないと思う。 – legollas007

関連する問題