Sql-Server

如果 B 列中的日期在彼此的“x”秒內,則從 A 列中選擇/連接多個行值

  • February 19, 2019

我有以下數據庫結構,需要一個查詢才能在 SQL Server 2008 和 SQL Server 2014 中工作。

數據庫:ASSETS

桌子:COMPUTERS

  PK (GUID)      (nvarchar)   (nvarchar)
|    PC_ID    |  PC_Hostname  |  Win_Ver |
+-------------+---------------+----------+
| ABCDE-12345 |   ACMEINC_1   |   W732   |
| FGHIJ-67890 |   ACMEINC_2   |   W732   |
| QWERT-34567 |   ACMEINC_3   |   W764   |
| JHGFD-87654 |   ACMEINC_1   |   W764   |
| CVBNM-08643 |   ACMEINC_1   |   W1064  |

桌子:SOFTWARE

   PK (GUID)      (GUID)      (int)   (nvarchar)         (datetime)
|    REG_ID   |    PC_ID    | SWType |  NAME_Reg |         DATE_Reg        |
+-------------+-------------+--------+-----------+-------------------------+
|  2WS3-8574  | ABCDE-12345 |    8   |   Bob     | 2018-02-19 15:30:10.980 |
|  D46G-2574  | ABCDE-12345 |    7   |   Admin   | 2018-02-19 15:30:12.001 |
|  7F4H-6523  | FGHIJ-67890 |    7   |   NULL    | 2018-03-01 11:02:02.954 |
|  MNDE-4567  | QWERT-34567 |    8   |   Joan    | 2018-11-23 09:28:59.685 |
|  8S22-1254  | QWERT-34567 |    7   | Warehouse | 2018-11-23 09:29:00.103 |
|  C9CC-1854  | JHGFD-87654 |    8   |   Barry   | 2018-11-23 09:46:21.321 |
|  JH21-6325  | JHGFD-87654 |    7   | Accounts  | 2018-11-23 09:46:21.332 |
|  109A-4785  | CVBNM-08643 |    8   |   Sally   | 2019-01-02 12:59:59.753 |
|  34NB-6855  | CVBNM-08643 |    7   |    HR     | 2019-01-02 13:00:00.211 |

我正在嘗試在 SOFTWARE 表中查詢“NAME_Reg”列中不是“NULL”的值。

如果兩個“DATE_Reg”值相隔 =< 5 秒,則它們應顯示在一行的結果中,“名稱”列中的值匹配“SWType”為 8,“部門”中的值匹配“SWType”為 7 ’ 柱子。

在 5 秒的時間範圍內,“DATE_Reg”中只會有 2 個條目。

結果應顯示連結在“PC_ID”上的相應“PC_Hostname”,以及與“SWType”值 8 對應的“DATE_Reg”值(真的,我可以使用兩個日期時間值中的任何一個)。

期望的輸出

| PC_Hostname |   Name   |    Dept   |         DATE_Reg        |
+-------------+----------+-----------+-------------------------+
|  ACMEINC_1  |    Bob   |   Admin   | 2018-02-19 15:30:10.980 |
|  ACMEINC_2  |   Joan   | Warehouse | 2018-11-23 09:28:59.685 |
|  ACMEINC_1  |   Barry  |  Accounts | 2018-11-23 09:46:21.321 |
|  ACMEINC_1  |   Sally  |     HR    | 2019-01-02 12:59:59.753 |

我對 SQL 仍然非常陌生,經過大量Google搜尋後,我得到的最接近的程式碼是以下程式碼。

USE ASSETS
SELECT c.PC_Hostname,
   CASE
       s.SWType
           when '8' then s.NAME_Reg
   END AS Name,
   CASE 
       s.SWType
           when '7' then s.NAME_Reg
   END AS Dept,
   s.DATE_Reg
FROM COMPUTERS c
   join SOFTWARE s ON (c.PC_ID = s.PC_ID)
WHERE s.NAME_Reg not like 'NULL'
ORDER BY c.PC_Hostname,s.DATE_Reg

但是,這會導致以下輸出,其中在交替行上仍然具有 Name & Dept 值,並且沒有時間範圍匹配。因此,在被困在這一點上並且不確定前進的方向之後,我希望這裡有人可以提供幫助。

| PC_Hostname |   Name   |      Dept     |         DATE_Reg        |
+-------------+----------+---------------+-------------------------+
|  ACMEINC_1  |   Bob    |     NULL      | 2018-02-19 15:30:10.980 |
|  ACMEINC_1  |   NULL   |     Admin     | 2018-02-19 15:30:12.001 |
|  ACMEINC_1  |   Barry  |     NULL      | 2018-11-23 09:46:21.321 |
|  ACMEINC_1  |   NULL   |   Accounts    | 2018-11-23 09:46:21.332 |
|  ACMEINC_1  |   Sally  |     NULL      | 2019-01-02 12:59:59.753 |
|  ACMEINC_1  |   NULL   |      HR       | 2019-01-02 13:00:00.211 |
|  ACMEINC_3  |   Joan   |     NULL      | 2018-11-23 09:28:59.685 |
|  ACMEINC_3  |   NULL   |   Warehouse   | 2018-11-23 09:29:00.103 |

您可以將software表連接到自身並DATEADD()用於 5 秒條件:

SELECT
   c.PC_Hostname,
   a.NAME_Reg     AS Name,
   b.NAME_Reg     AS Dept,
   a.DATE_Reg,
   b.DATE_Reg     AS DATE_Reg_b 
FROM
   assets.software AS a
 JOIN
   assets.software AS b
 ON    a.PC_ID  = b.PC_ID
   AND a.SWType = 8
   AND b.SWType = 7
   AND a.DATE_Reg &gt;= DATEADD(second, -5, b.DATE_Reg)
   AND a.DATE_Reg &lt;= DATEADD(second, +5, b.DATE_Reg)
 LEFT JOIN
   assets.computers AS c
 ON   a.PC_ID = c.PC_ID
WHERE
     a.NAME_Reg IS NOT NULL
 AND b.NAME_Reg IS NOT NULL
 ;

引用自:https://dba.stackexchange.com/questions/230146