0

问题:

我正在尝试使用我在 mysql 数据库上的历史数据摘要创建一个关于 redash 的可视化。我发现它严重依赖 SQL,而且我发现 python 支持并不那么容易管理。

碰巧我在数据库中有几个表每天报告一些统计数据(所有浮点数)。

我想在每个表上查询从今天开始计算的最长的历史数据,它应该只需要原始(我的)SQL 查询,不需要过程 =/

考虑以下示例数据集...

今天是2020-10-21

DROP TABLE IF EXISTS table1;

CREATE TABLE table1
(date DATE NOT NULL PRIMARY KEY);

INSERT INTO table1 VALUES
('2020-10-17'),
('2020-10-19'),
('2020-10-20'),
('2020-10-21');


DROP TABLE IF EXISTS table2;

CREATE TABLE table2
(date DATE NOT NULL PRIMARY KEY);

INSERT INTO table2 VALUES
('2020-10-18'),
('2020-10-19'),
('2020-10-20'),
('2020-10-21');

我想做到这一点:

mydata.tables longest_streak
table1        3
table2        4

编辑:我应该补充一点,我能够从信息模式中提取表列表,我应该使用可能的“UNION”命令运行它,但我仍然很难仅使用可能带有几个子选择的原始查询来使用它.

EDIT2:我能够这样查询

    SELECT 
        CONCAT('SELECT DISTINCT ''', table_name, ''', dateday  FROM ', 'mydata.', table_name) AS query_string
    FROM
        information_schema.tables
    WHERE
        TABLE_SCHEMA like 'mydata' and TABLE_NAME like 'table%'

这会将一般查询作为字符串提供给我大致需要做的事情,问题是 Redash 严重依赖原始 SQL 查询。也许我可以在 Redash 调用它的 db 中添加一个过程,但我认为对于这个 db 来说这是不行的(由于政策)

4

1 回答 1

1

这是 8.0 之前的 MySQL 版本的方法...

SELECT tab
     , MAX(i) i 
  FROM 
     ( SELECT tab
            , date
            , CASE WHEN @prev_tab = tab THEN CASE WHEN @prev_date >= date - INTERVAL 1 DAY THEN @i:=@i+1 ELSE @i:=1 END ELSE @i:=1 END i
            , @prev_tab := tab
            , @prev_date := date 
         FROM 
            ( SELECT 1 tab, date FROM table1
               UNION
              SELECT 2    , date FROM table2
             -- repeat as necessary or, better, fix your schema
               ORDER 
                  BY tab
                   , date
            ) x
         JOIN
            ( SELECT @prev_tab:=null, @prev_date:=null,@i:=0) vars
     ) a
 GROUP
    BY tab;

+-----+------+
| tab | i    |
+-----+------+
|   1 |    3 |
|   2 |    4 |
+-----+------+
于 2020-10-21T14:27:00.297 回答