MySQL 获取所有商店的最新条目

Posted

技术标签:

【中文标题】MySQL 获取所有商店的最新条目【英文标题】:MySQL Get Latest Entry For All Stores 【发布时间】:2019-01-01 08:40:18 【问题描述】:

我正在尝试从记录每 15 分钟累积销售总额的表中获取最新行。

表格的基本布局是

StoreID, Time, Sales, Tax, Date

我希望能够返回每个商店 ID 的最新记录。到目前为止我尝试过的查询是:

SELECT t.StoreID, MAX(t.Time) as 'Last Reported', t.Sales+t.Tax as Sales, t.Date FROM ( SELECT * FROM trickledata WHERE Date = '20180724' ) t GROUP BY t.StoreID;

这可行,但它不会暂时返回相应的销售额。例如。

+---------+---------------+-------+------------+ | StoreID | Last Reported | Sales | Date | +---------+---------------+-------+------------+ | 100 | 11:45:00 | 0.00 | 2018-07-24 | | 111 | 12:00:00 | 0.00 | 2018-07-24 | | 115 | 12:00:00 | 0.00 | 2018-07-24 | | 121 | 12:00:00 | 0.00 | 2018-07-24 | | 122 | 12:00:00 | 0.00 | 2018-07-24 | | 123 | 12:00:00 | 0.00 | 2018-07-24 | | 124 | 12:00:00 | 0.00 | 2018-07-24 | | 125 | 12:00:00 | 0.00 | 2018-07-24 | | 126 | 12:00:00 | 0.00 | 2018-07-24 | | 127 | 12:00:00 | 0.00 | 2018-07-24 | | 128 | 12:00:00 | 0.00 | 2018-07-24 | | 129 | 12:00:00 | 0.00 | 2018-07-24 | | 130 | 12:00:00 | 0.00 | 2018-07-24 | | 131 | 12:00:00 | 0.00 | 2018-07-24 | | 135 | 12:00:00 | 0.00 | 2018-07-24 | | 137 | 12:00:00 | 0.00 | 2018-07-24 | | 138 | 12:00:00 | 0.00 | 2018-07-24 | | 141 | 12:00:00 | 0.00 | 2018-07-24 | | 150 | 12:00:00 | 0.00 | 2018-07-24 | | 160 | 12:00:00 | 0.00 | 2018-07-24 | | 164 | 12:00:00 | 0.00 | 2018-07-24 |

但当时有销售,因为当我查询商店 121 的具体日期和时间时,我得到:

+---------+------------+----------+-------+------+ | StoreID | Date | Time | Sales | Tax | +---------+------------+----------+-------+------+ | 121 | 2018-07-24 | 12:00:00 | 65.79 | 4.55 | +---------+------------+----------+-------+------+

CREATE TABLE 语句:

``CREATE TABLE `trickledata` (
    `StoreID` INT(11) NULL DEFAULT NULL,
    `Date` DATE NULL DEFAULT NULL,
    `Time` TIME NULL DEFAULT NULL,
    `Sales` DECIMAL(10,2) NULL DEFAULT NULL,
    `Tax` DECIMAL(10,2) NULL DEFAULT NULL,
    UNIQUE INDEX `Date` (`Date`, `Time`, `StoreID`),
    INDEX `by_date` (`Date`),
    INDEX `by_store` (`StoreID`)
)
COLLATE='utf8mb4_general_ci'
ENGINE=InnoDB
;
``

样本数据: INSERT LOW_PRIORITY IGNORE INTO `trickle`.`trickledata_copy` (`StoreID`, `Date`, `Time`, `Sales`, `Tax`) VALUES ('0100', '20180724', '120000', '212.63', '15.37'), ('0100', '20180724', '114500', '212.63', '15.37'), ('0100', '20180724', '113000', '212.63', '15.37'), ('0100', '20180724', '111500', '212.63', '15.37'), ('0100', '20180724', '110000', '212.63', '15.37'), ('0100', '20180724', '104500', '212.63', '15.37'), ('0100', '20180724', '103000', '212.63', '15.37'), ('0100', '20180724', '101500', '.00', '.00'), ('0100', '20180724', '100000', '.00', '.00'), ('0100', '20180724', '94500', '.00', '.00'), ('0100', '20180724', '93000', '.00', '.00'), ('0100', '20180724', '91500', '.00', '.00'), ('0100', '20180724', '90000', '.00', '.00'), ('0100', '20180724', '84500', '.00', '.00'), ('0100', '20180724', '83000', '.00', '.00'), ('0100', '20180724', '81500', '.00', '.00'), ('0100', '20180724', '80000', '.00', '.00'), ('0100', '20180724', '74500', '.00', '.00'), ('0100', '20180723', '253000', '986.07', '71.44'), ('0100', '20180723', '251500', '986.07', '71.44'), ('0100', '20180723', '250000', '986.07', '71.44'), ('0100', '20180723', '244500', '986.07', '71.44'), ('0100', '20180723', '243000', '986.07', '71.44'), ('0100', '20180723', '241500', '986.07', '71.44'), ('0100', '20180723', '240000', '986.07', '71.44'), ('0100', '20180723', '234500', '986.07', '71.44'), ('0100', '20180723', '233000', '986.07', '71.44'), ('0100', '20180723', '231500', '986.07', '71.44'), ('0100', '20180723', '230000', '986.07', '71.44'), ('0100', '20180723', '224500', '986.07', '71.44'), ('0100', '20180723', '223000', '986.07', '71.44'), ('0100', '20180723', '221500', '986.07', '71.44'), ('0100', '20180723', '220000', '986.07', '71.44'), ('0100', '20180723', '214500', '986.07', '71.44'), ('0100', '20180723', '213000', '986.07', '71.44'), ('0100', '20180723', '120000', '986.07', '71.44'), ('0100', '20180723', '210000', '986.07', '71.44'), ('0100', '20180723', '204500', '986.07', '71.44');

编辑#2: 使用该示例数据并运行查询会产生 0.00 错误。但是跑步 SELECT * FROM trickledata WHERE Time = '120000 产生 $212.63 的结果

我的 MariaDB 版本也是 10.1.29

编辑#3: 我尝试了以下方法:

''SELECT t.* FROM trickledata t
    -> JOIN (
    -> SELECT StoreID, MAX(Time) AS latest, Sales, Date
    -> FROM trickledata
    -> WHERE Date = '20180724'
    -> GROUP BY StoreID
    -> ) m ON t.StoreID = m.StoreID AND t.Time = m.latest;''

但是,它会返回我中午的每个日期。我只想要今天的数据。

编辑#4: 我发现如果我删除唯一索引,我的初始查询会按预期工作。但我不明白为什么。我还需要该唯一索引来防止添加重复项,因为这是从 csv 文件中读取信息。

【问题讨论】:

请将表格的结构提供为CREATE TABLE 语句以及一些示例数据作为INSERT INTO 语句。使用该样本数据添加预期结果。还请考虑提及您正在使用的 MariaDB 版本。 我已经更新了帖子。谢谢。 查看我添加的标签。 我探索了那个标签并尝试了一些答案,但是它要么给了我当时所有可能的数据点,即使我按日期排序,或者它再次给了我错误。 【参考方案1】:

尝试使用相关子查询过滤时间,获取一天的最长时间并存储。

SELECT `t1`.`storeid` `StoreId`,
       `t1`.`time` `Last Reported`,
       `t1`.`sales` + `t1`.`tax` `Sales`,
       `t1`.`date` `Date`
       FROM `trickledata` `t1`
       WHERE `t1`.`date` = '2018-07-24'
             AND `t1`.`time` = (SELECT max(`t2`.`time`)
                                       FROM `trickledata` `t2`
                                       WHERE `t2`.`storeid` = `t1`.`storeid`
                                             AND `t2`.`date` = `t1`.`date`);

如果有重复(同一天同一商店的两个或多个报告),它们将被显示。如果您想排除它们,您必须定义另一个标准,该标准应该在报告中定义一个额外的顺序。

【讨论】:

这适用于我的原始数据集。我有一个唯一的密钥来防止添加重复项。不过我有几个问题。当一家商店的报告比其他商店晚时如何处理? @JarrettDuskey:我将为每家商店获取最新报告。假设商店 1 的最后报告是从 09:00 开始,商店 2 的最后报告是从 15:00 开始,它将显示商店 1 从 09:00 开始的数据和商店 2 在 15:00 的数据。 好吧,这很有道理。你知道为什么我的原始查询在我没有唯一键的情况下有效吗? @JarrettDuskey:无论如何,您的原始查询格式不正确。并非列列表中的所有列都是聚合函数的参数,也不是 GROUP BY 子句中的参数。当ONLY_FULL_GROUP_BY 未设置时,MariaDB(和 mysql)会接受,但结果可能很奇怪。也许这也是你 0 的原因。

以上是关于MySQL 获取所有商店的最新条目的主要内容,如果未能解决你的问题,请参考以下文章

Python sqlite3 SQL查询获取具有最新日期但每个唯一列限制的所有条目

如何在 mySql 中获取所有具有值的条目,然后遍历 foreach

获取以条目字符串开头的列表,然后给出mysql数据库中可用的所有结果

MySQL查询从具有1000万行的表中获取每个条目的最新记录

从数据库中获取最新条目

使用 MySQL 查询每天上午 11 点之前