Sql-Server
如果 B 列中的日期在彼此的“x”秒內,則從 A 列中選擇/連接多個行值
我有以下數據庫結構,需要一個查詢才能在 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 >= DATEADD(second, -5, b.DATE_Reg) AND a.DATE_Reg <= 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 ;