-1

我在下面的最后一部分“递归”中挣扎。当然,我可以使用 C# 循环访问数据库中的每一天的 TimestampOrigin。这将意味着数百次相同的查询。但是使用“带递归”的一个查询可能是可能的。

测试数据:

CREATE TABLE tblData(
  Id INT, ComputerName TEXT, TimestampOrigin TEXT, Timestamp TEXT, Number INT
);

DELETE FROM tblData;

INSERT INTO tblData VALUES (1, "Computer1", '2021-02-10 12:00:00', '2021-02-27 12:00:00', 35);
INSERT INTO tblData VALUES (2, "Computer2", '2021-02-10 12:00:00', '2021-02-27 12:00:00', 24);
INSERT INTO tblData VALUES (3, "Computer3", '2021-02-09 12:00:00', '2021-02-26 12:00:00', 23);
INSERT INTO tblData VALUES (3, "Computer4", '2021-02-09 12:00:00', '2021-02-26 12:00:00', null);
INSERT INTO tblData VALUES (4, "Computer5", '2021-02-08 12:00:00', '2021-02-25 12:00:00', 7);
INSERT INTO tblData VALUES (5, "Computer6", '2021-02-08 12:00:00', '2021-02-25 12:00:00', 0);
INSERT INTO tblData VALUES (7, "Computer7", '2021-02-07 12:00:00', '2021-02-24 12:00:00', 9);

按 T​​imestampOrigin 分组的查询:

SELECT DATE(TimestampOrigin) AS TimestampOrigin,
SUM(CASE WHEN Number < 1 THEN 1 ELSE 0 END) AS Less1,
SUM(CASE WHEN Number >= 0 AND Number < 10 THEN 1 ELSE 0 END) AS Less10,
SUM(CASE WHEN Number >= 10 AND Number < 25 THEN 1 ELSE 0 END) AS Less25
FROM tblData WHERE Number NOT NULL GROUP BY DATE(TimestampOrigin) ORDER BY TimestampOrigin DESC

我每天需要的是当前到时间戳的总和,即当天+17天。以 2021-02-08 天为例,时间戳来源为 2021-02-08 到 2021-02-08 +17 天的所有行的总和(时间戳列)。不知道是否真的需要 TimestampOrigin +17 天的中午时间的额外列 Timestamp。但是随着时间的推移查询是我在项目一开始就创建它的原因。

SELECT DATE(TimestampOrigin) AS TimestampOrigin,
SUM(CASE WHEN Number < 1 THEN 1 ELSE 0 END) AS Less1,
SUM(CASE WHEN Number >= 0 AND Number < 10 THEN 1 ELSE 0 END) AS Less10,
SUM(CASE WHEN Number >= 10 AND Number < 25 THEN 1 ELSE 0 END) AS Less25
FROM tblData WHERE Number NOT NULL AND DATE(TimestampOrigin) >= DATE('2021-02-08') AND DATE(TimestampOrigin) <= DATE('2021-02-08', '+17 day')

我没有每天执行数百次上述查询并求和,而是认为“使用递归”是正确的方法“。但到目前为止还不能让它工作。在哪里添加 17 天?

WITH RECURSIVE cte AS (
    SELECT Id, ComputerName, Timestamp, DATE(Timestamp,'+1 day') totime, Number, TimestampOrigin
    FROM tblData
    UNION ALL
    SELECT Id, ComputerName, DATE(Timestamp,'+1 day'), DATE(totime,'+1 day'), Number, TimestampOrigin
    FROM cte
    WHERE Number NOT NULL AND DATE(Timestamp,'+1 day') < DATE('2021-02-11')
)
    SELECT DATE(TimestampOrigin), 
    SUM(CASE WHEN Number < 1 THEN 1 ELSE 0 END) AS Less1,
    SUM(CASE WHEN Number >= 0 AND Number < 10 THEN 1 ELSE 0 END) AS Less10,
    SUM(CASE WHEN Number >= 10 AND Number < 25 THEN 1 ELSE 0 END) AS Less25
FROM cte GROUP BY DATE(TimestampOrigin) ORDER BY DATE(TimestampOrigin) DESC

预期结果将是(就像我在测试数据中的 4 天中的每一天运行上述查询时一样):

在此处输入图像描述

4

2 回答 2

1

不需要递归 CTE。根据您的条件
将 distinct s 加入表并聚合:TimestampOrigin

SELECT t1.TimestampOrigin,
       SUM(t2.Number < 1) AS Less1,
       SUM(t2.Number >= 0 AND t2.Number < 10) AS Less10,
       SUM(t2.Number >= 10 AND t2.Number < 25) AS Less25
FROM (SELECT DISTINCT DATE(TimestampOrigin) TimestampOrigin FROM tblData) t1 
INNER JOIN tblData t2
ON DATE(t2.TimestampOrigin) BETWEEN t1.TimestampOrigin AND DATE(t1.TimestampOrigin, '+17 days')
GROUP BY t1.TimestampOrigin 
ORDER BY t1.TimestampOrigin DESC

请参阅演示
结果:

时间戳来源 减1 减10 少25
2021-02-10 0 0 1
2021-02-09 0 0 2
2021-02-08 1 2 2
2021-02-07 1 3 2
于 2021-02-23T15:28:55.577 回答
0

结果是错误的。我发现我最初的查询是错误的。但是使用@forpas 的解决方案,它最终起作用了。

初始单个查询

    SELECT 
        SUM(Number < 1) AS Less1,
        SUM(Number >= 1 AND Number < 10) AS Less10,
        SUM(Number >= 10 AND Number < 25) AS Less25
    FROM tblPCHardwareInformation WHERE UniqueInventoryKey IN
    (
        SELECT UniqueInventoryKey FROM tblPCHardwareInformation WHERE Number NOT NULL AND DATE(Timestamp) BETWEEN DATE('2020-10-09') AND DATE('2020-10-09', '+17 day') GROUP BY ComputerName ORDER BY Timestamp DESC
    )

结果:

SELECT t1.TimestampOrigin,
       SUM(t2.Number < 1) AS Less1,
       SUM(t2.Number >= 1 AND t2.Number < 10) AS Less10,
       SUM(t2.Number >= 10 AND t2.Number < 25) AS Less25
FROM (SELECT DISTINCT DATE(TimestampOrigin) TimestampOrigin FROM tblPCHardwareInformation) t1 
INNER JOIN tblPCHardwareInformation t2
ON UniqueInventoryKey IN
(
    SELECT UniqueInventoryKey FROM tblPCHardwareInformation WHERE Number NOT NULL AND DATE(Timestamp) BETWEEN DATE(t1.TimestampOrigin) AND DATE(t1.TimestampOrigin, '+17 day') GROUP BY ComputerName ORDER BY Timestamp DESC
)
GROUP BY t1.TimestampOrigin 
ORDER BY t1.TimestampOrigin DESC
于 2021-02-26T12:53:37.543 回答