2016-09-18 24 views
2

テーブルを集計するために集計関数(AVG、COUNT)でTO_SECONDSを使用したいと思います。しかし、結果は私が期待したものではありませんでした。ここでは例のテーブルには、次のとおりです。MariaDB/MySQL TO_SECONDSとAGGREGATE関数

MariaDB [test]> select * from mytable; 
+----+---------------------+------+ 
| id | ts     | val | 
+----+---------------------+------+ 
| 1 | 2016-01-01 01:02:03 | 1 | 
| 2 | 2016-01-01 01:02:04 | 2 | 
| 3 | 2016-01-01 01:02:04 | 3 | 
| 4 | 2016-01-01 01:02:05 | 4 | 
| 5 | 2016-01-01 01:02:05 | 5 | 
+----+---------------------+------+ 

クエリ#1(OK):

MariaDB [test]> select to_seconds(ts) as tsec from mytable; 
+-------------+ 
| tsec  | 
+-------------+ 
| 63618829323 | 
| 63618829324 | 
| 63618829324 | 
| 63618829325 | 
| 63618829325 | 
+-------------+ 

クエリ#2(?):

MariaDB [test]> select to_seconds(ts) as tsec, avg(val) mval from mytable group by tsec; 
+------------+------+ 
| tsec  | mval | 
+------------+------+ 
| 2147483647 | 3 | 
+------------+------+ 

期待される結果:

+-------------+------+ 
| tsec  | mval | 
+-------------+------+ 
| 63618829323 | 1 | 
| 63618829324 | 2.5 | 
| 63618829325 | 4.5 | 
+-------------+------+ 

SQLフィドル:http://sqlfiddle.com/#!9/17616a/6
MariaDBのバージョン> mysql Ver 15.1 Distrib 10.1.17-MariaDB、Linux(x86_64)for readline 5.1

もちろん、他のDATE/TIME関数(UNIX_TIMESTAMPなど)を使用してタスクを実行できます。しかし、なぜ結果が違うのかを知りたい。
私は何が欠けていますか?私はTO_SECONDSの使用法を誤解していますか?

+0

これはデータ型の問題のようです。戻り値は大きなintではなく整数として扱われています。 –

答えて

1

これは、奇妙なデータ型の問題です。以下は、作業を行います。

select cast(to_seconds(ts) as decimal(20, 0)) as tsec, avg(val) 
from mytable 
group by tsec; 

私はto_seconds()の戻り値は、あなたがそれを選択したときに値を格納するのに十分な大きさになる理由を知りませんが、group byを使用するときに整数に変換されます。

+0

迅速な回答ありがとうございます。 – putu

関連する問題