簡體   English   中英

在 SQL 服務器中將 15 分鍾轉換為 10 分鍾時間序列

[英]Convert 15min to 10min timeseries in SQL Server

我有一個 15 分鍾格式的時間序列,其中包含四個不同的變量。 我需要將其轉換為 10 分鍾的時間序列格式。 由於某些限制,我需要在 SQL 中執行此操作,我同意這可能是執行此操作的最糟糕的選擇語言。但我相信它是可行的。

我認為需要做的是將每個 15 分鍾的數據點分成三個 5 分鍾的數據點,然后將每兩個 5 分鍾的數據點添加到一個 10 分鍾的數據點中。 手動完成這給了我正確的結果。

下面是一些顯示初始表的示例 DDL SQL:

IF OBJECT_ID('tempdb..#Temp15min') IS NOT NULL DROP TABLE #Temp15min

CREATE TABLE #Temp15min
(
    Project_id INT,
    Project_name VARCHAR(25),
    Date_results DATETIME,
    Pplus INT,
    Pminus INT,
    Qplus INT,
    Qminus INT,
    Zone VARCHAR(2)
)

INSERT INTO #Temp15min (Project_id, Project_name, Date_results, Pplus, Pminus, Qplus, Qminus, Zone)
VALUES 
(1, 'USA_Project', '2020-01-09 00:00',9879, 7766, 3886, 6628, 'US'),
(1, 'USA_Project', '2020-01-09 00:15', 15420, 10969, 5743, 9568, 'US'),
(1, 'USA_Project', '2020-01-09 00:30', 8763, 6602, 5475, 512, 'US'),
(1, 'USA_Project', '2020-01-09 00:45', 6998, 1083, 277, 13360, 'US'),
(1, 'USA_Project', '2020-01-09 01:00', 14356, 275, 1580, 14184, 'US'),
(1, 'USA_Project', '2020-01-09 01:15', 22983, 6161, 7815, 6917, 'US'),
(1, 'USA_Project', '2020-01-09 01:30', 7653, 5080, 2742, 8086, 'US'),
(1, 'USA_Project', '2020-01-09 01:45', 276, 14977, 10318, 3485, 'US')

最終結果表:

IF OBJECT_ID('tempdb..#Temp10min') IS NOT NULL DROP TABLE #Temp10min

CREATE TABLE #Temp10min
(
    Project_id INT,
    Project_name VARCHAR(25),
    Date_results DATETIME,
    Pplus INT,
    Pminus INT,
    Qplus INT,
    Qminus INT,
    Zone VARCHAR(2)
)

INSERT INTO #Temp10min (Project_id, Project_name, Date_results, Pplus, Pminus, Qplus, Qminus, Zone)
VALUES 
(1, 'USA_Project', '2020-01-09 00:00', 6586, 5177, 2591, 4419, 'US'),
(1, 'USA_Project', '2020-01-09 00:10', 8433, 6245, 3210, 5399, 'US'),
(1, 'USA_Project', '2020-01-09 00:20', 10280, 7313, 3829, 6379, 'US'),
(1, 'USA_Project', '2020-01-09 00:30', 5842, 4401, 3650, 341, 'US'),
(1, 'USA_Project', '2020-01-09 00:40', 5254, 2562, 1917, 4624, 'US'),
(1, 'USA_Project', '2020-01-09 00:50', 4665, 722, 185, 8907, 'US'),
(1, 'USA_Project', '2020-01-09 00:00', 9571, 183, 1053, 9456, 'US'),
(1, 'USA_Project', '2020-01-09 00:10', 12446, 2145, 3132, 7034, 'US'),
(1, 'USA_Project', '2020-01-09 00:20', 15322, 4107, 5210, 4611, 'US'),
(1, 'USA_Project', '2020-01-09 00:30', 5102, 3387, 1828, 5391, 'US'),
(1, 'USA_Project', '2020-01-09 00:40', 2643, 6686, 4353, 3857, 'US'),
(1, 'USA_Project', '2020-01-09 00:50', 184, 9985, 6879, 2323, 'US')

完整性檢查以確保數字從頭到尾都是正確的:

SELECT Project_id, Project_name, SUM(Pplus) PplusTotal, SUM(Pminus) PminusTotal, Sum(Qplus) QplusTotal, Sum(Qminus) QminusTotal, Zone FROM #Temp15min GROUP BY Project_id, Project_name, Zone
UNION
SELECT Project_id, Project_name, SUM(Pplus), SUM(Pminus), Sum(Qplus), Sum(Qminus), Zone FROM #Temp10min GROUP BY Project_id, Project_name, Zone

圖形化的轉換是這樣的:

  • 左表是15分鍾的數據點
  • 中間表是5分鍾的數據點
  • 右表是10分鍾的數據點

15分鍾到5分鍾到10分鍾

我了解請求的復雜性,因此非常感謝任何幫助!

根據您的描述,您可以為每一分鍾“取消透視”,然后重新聚合:

select Project_id, Project_name, min(dateadd(minute, v.minutes, t.dateresults)) as dt,
       t.zone,
       sum(Pplus / 3.0),
       sum(Pminus / 3.0),
       sum(Qplus / 3.0),
       sum(Qminus / 3.0)
from #Temp15min t cross join
     (values (0), (5), (10)) v(minutes)
group by convert(date, dateadd(minute, v.minutes, t.dateresults)),
         datepart(hour, dateadd(minute, v.minutes, t.dateresults)),
         datepart(minute, dateadd(minute, v.minutes, t.dateresults)) / 6,
         Project_id, Project_name, zone;

基於 Gordon Linoff 的回答以及其他 stackoverflow 帖子並適用於 SQL 服務器,我使用了以下代碼:


IF OBJECT_ID('tempdb..#Tempminutes') IS NOT NULL DROP TABLE #Tempminutes

CREATE TABLE #Tempminutes
(
    Minutes INT
)

INSERT INTO #Tempminutes VALUES (0),(5),(10)



select Project_id, Project_name, min(dateadd(minute, v.minutes, t.date_results)) as dt,
       t.zone,
       sum(Pplus / 3.0),
       sum(Pminus / 3.0),
       sum(Qplus / 3.0),
       sum(Qminus / 3.0)
from #Temp15min t cross join
     #Tempminutes v
GROUP BY
        DATEPART(YEAR, dateadd(minute, v.minutes, t.date_results)),
        DATEPART(MONTH, dateadd(minute, v.minutes, t.date_results)),
        DATEPART(DAY, dateadd(minute, v.minutes, t.date_results)),
        DATEPART(HOUR, dateadd(minute, v.minutes, t.date_results)),
        (DATEPART(MINUTE, dateadd(minute, v.minutes, t.date_results)) / 10),
        Project_id, Project_name, zone

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM