【发布时间】: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 版本。 -
我已经更新了帖子。谢谢。
-
查看我添加的标签。
-
我探索了那个标签并尝试了一些答案,但是它要么给了我当时所有可能的数据点,即使我按日期排序,或者它再次给了我错误。
标签: sql mariadb greatest-n-per-group