大規模なデータセットで動作する合理的に簡単なクエリがあります。()とdateaddの間のmysqlの相違
IN演算子を使用すると、正しい結果が得られます。
DATE_ADD()を使用すると、私は間違っていると思われる結果を得ます。
SELECT
e.date, er.ratio, e.total as recalc
FROM
equity e
JOIN
exchange_rate er ON e.date = er.date
AND LOWER(er.currency) = LOWER(e.currency)
join account a
on e.account = a.id
WHERE
-- e.date >= DATE_ADD(DATE(NOW()), INTERVAL - 5 DAY)
-- e.date in ('2016-11-14','2016-11-15','2016-11-16')
and a.lynx_country = 'BE'
、INの後の括弧内の値は、私はさらに
SELECT
distinct date
FROM
equity e
WHERE
e.date >= DATE_ADD(DATE(NOW()), INTERVAL - 5 DAY)
を行うだろう時に値が返されます(2つのコメント行は、2つのオプションです):
クエリは次のとおりです。結果セットは2つのクエリで同じですが、ラッパークエリを追加すると大きな違いが生じます
ラッパーを含む完全なクエリ:
select ROUND(SUM(total)/ratio, 2) as agg, date
from (
SELECT
e.date, er.ratio, e.total
FROM
equity e
JOIN
exchange_rate er ON e.date = er.date
AND LOWER(er.currency) = LOWER(e.currency)
join account a
on e.account = a.id
WHERE
e.date >= DATE_ADD(DATE(NOW()), INTERVAL - 5 DAY)
-- e.date in ('2016-11-14','2016-11-15','2016-11-16')
and a.lynx_country = 'BE'
) dummy
group by date
間違った結果:DATE_ADD(DATE(NOW())、INTERVAL - 5 DAY)
agg | date
------------------------
68833599.13 | 2016-11-14
69350727.47 | 2016-11-15
69351461.28 | 2016-11-16
正しい結果:( '2016年11月14日'、 '2016年11月15日で」、 '2016年11月16日')
agg | date
-------------------------
101956327.03 | 2016-11-14
102722297.52 | 2016-11-15
102723384.45 | 2016-11-16
すべてのヘルプは
本当に2つのクエリ間で何が変化しているかを示すことで、質問を明確にしてください。 WHERE句は変更されていますが、2番目のクエリでは集計を行っています。 –
両方のバリアントで最初のクエリの出力(集約ラッパーなし)は同じですか?そして出力は何ですか? – Kleskowy
はい、出力は9000行です – ShadowFlame