【问题标题】:Find % of days of the week using timestamp from MySQL database使用 MySQL 数据库中的时间戳查找一周中的天数百分比
【发布时间】:2015-03-04 16:13:34
【问题描述】:

我有一个名为“purchases”的 MySQL 数据库表,其中填充了各种交易的记录。我希望找出一周中特定日期发生的事务百分比,并且想知道如何使用 SQL 来实现这一目标。我在此表中有一个名为“已提交”的字段,其中包含记录事务时的标准 unix 时间戳。

到目前为止我所拥有的:

SELECT COUNT(DISTINCT DATE_FORMAT(submitted,%a)) FROM purchases;

我的最终目标是创建一个表格,其中包含周一至周日给定日期所有交易的百分比。

我的表结构如下:

CREATE TABLE IF NOT EXISTS `purchases` (<br />
  `id` int(11) NOT NULL AUTO_INCREMENT,<br />
  `orderinfo` varchar(50) NOT NULL,<br />
  `amount` varchar(5) NOT NULL,<br />
  `reference` varchar(15) NOT NULL,<br />
  `name` varchar(50) NOT NULL,<br />
  `address` varchar(100) NOT NULL,
  `town` varchar(50) NOT NULL,<br />
  `postcode` varchar(12) NOT NULL,<br />
  `submitted` int(11) NOT NULL,<br />
  UNIQUE KEY `id` (`id`)<br />
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

【问题讨论】:

  • 您应该首先搜索并查看 mysql 日期函数
  • 您是否尝试过编写任何 SQL 来实现这一点?
  • 是的,我无法让它工作。我会尽快发布我的作品。谢谢
  • 这就是为什么你真的应该为字段使用正确的数据类型。您最好将时间戳字段更新为DATETIME

标签: php mysql sql datetime count


【解决方案1】:

将时间戳转换为日期,然后获取 COUNT,这将获取计数和百分比

SELECT date ( from_unixtime(submitted) ), count(*) as `count`, count(*)/(select count(*) from purchases)*100 as percentage
FROM purchases
GROUP BY date ( from_unixtime(submitted) ); 

【讨论】:

  • 您好,我已经添加了我的表结构,这很好,感谢您的及时响应,但所有记录都是不同的。
  • 我们还需要排除 ('hours', 'mins', ..) 然后 GROUP BY 将显示计数。我将给出完整的查询。 DATE() 将提取日期的日期部分:-)
  • 非常感谢,我一整天都在努力!!
  • 现在检查最后一个,因为我无法测试自己
【解决方案2】:

您可以通过这样的两个嵌套查询获得所需的内容(拆分为更多行并缩进以提高可读性)

SELECT
    DAYOFWEEK(FROM_UNIXTIME(`submitted`)),
    100 * COUNT(*) /
        (SELECT COUNT(*) from `purchases`)
FROM
    `purchases`
GROUP BY
    DAYOFWEEK(FROM_UNIXTIME(`submitted`))

请注意,内部查询 (SELECT COUNT(*) from purchases) 用于检索购买总数,因为您需要一个百分比数字。

mysql 的DAYOFWEEK() 返回的不是当天的名称,而是从 1 到 7 的索引号。 您可以在此处查看 mysql date ant time 函数的参考: http://dev.mysql.com/doc/refman/5.6/en/date-and-time-functions.html

如果你只需要一个查询,那么你就完成了。

如果你想用那个查询构建一个 view 你不能因为mysql不允许在视图的定义中嵌套SELECT。 然后,您可以将作业拆分为两个视图,一个仅计算记录总数,第二个计算百分比。


关于性能的最后说明:

如果您有大量记录需要处理,则执行速度不会很快。

如果您计划经常运行查询,这是不好的。

在这种情况下,由于submitted 很可能只被写入一次并且永远不会更改,因此您可以考虑在表中添加另一个名为submitted_dayofweek 的字段,输入int

当您更新subitted 时,同时更新submitted_dayofweek 存储DAYOFWEEK(FROM_UNIXTIME(submitted))

最后确保 submitted_dayofweek 被索引。

查询变为

SELECT
    `submitted_dayofweek`,
    100 * COUNT(*) /
        (SELECT COUNT(*) from `purchases`)
FROM
    `purchases`
GROUP BY
    `submitted_dayofweek`

而且运行速度非常快,但会占用更多存储空间。

【讨论】:

  • 谢谢保罗,非常感谢!!
  • 不客气,希望我的回答能让您了解查询的工作原理。
猜你喜欢
  • 1970-01-01
  • 2019-06-24
  • 1970-01-01
  • 2011-04-20
  • 2022-01-12
  • 2013-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多