如何选择在给定日期尚未更新的MySQL表值?

时间:2019-05-10 13:35:57

标签: mysql sql select

我有一个名为mydb的MySQL数据库,其中存储了以下数据库的每日股价: 名为data的表中的423家公司。表数据包含以下列:

`epic`, `date`, `open`, `high`, `low`, `close`, `volume`

epicdate是主键对。 我每天使用csv文件更新数据表,该文件通常具有423行 都具有相同日期的数据。但是,某些时候价格可能不可用 所有423家公司的数据,特定史诗和日期对的数据将 无法更新。为了确定丢失的一对,我求助于 使用以下命令将史诗的完整列表与史诗的不完整列表进行比较 两个不同日期的简单SELECT查询,然后使用文件比较器,因此 揭示遗失的史诗。到目前为止,这不是一个令人满意的解决方案 我无法构造一个查询来识别任何史诗 在任何特定日期都没有更新。

SELECT `epic`, `date` FROM `data`
WHERE `date` IN ('2019-05-07', '2019-05-08')
ORDER BY `epic`, `date`;

产生一对值:

`epic`  `date`
"3IN"   "2019-05-07"
"3IN"   "2019-05-08"
"888"   "2019-05-07"
"888"   "2019-05-08"
"AA."   "2019-05-07"
"AAL"   "2019-05-07"
"AAL"   "2019-05-08"

在这种情况下为AA。尚未于2019-05-08更新。问题是发现不成对的值并不容易。 对于此问题的任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

您可以对史诗进行COUNT的操作,对该日期范围内的项目使用GROUP BY史诗,并查看是否得到COUNT小于2的任何内容,然后从中进行选择结果,其中UpdateCount小于2,如果列名上的语法不正确,请原谅我在SQL Server中工作,但是查询的逻辑仍然对您有用。

SELECT x.epic
FROM
(
    SELECT COUNT(*) AS UpdateCount, epic
    FROM data
    WHERE date IN ('2019-05-07', '2019-05-08')
    GROUP BY epic
) AS x
WHERE x.UpdateCount < 2

答案 1 :(得分:0)

假设您只想查看上次上传的日期,则以下内容将返回2019年5月8日未更新的所有项目:

SELECT last_updated.epic, last_updated.date
FROM (
SELECT epic , max(`date`) AS date FROM `data`
GROUP BY 'epic'
) AS last_updated
WHERE 'date' <> '2019-05-08'
ORDER BY 'epic'
;

或对于任何上传日期,以下内容都将与整个数据库进行比较,因此您不必依靠'2019-08-07'的每一行都是史诗级的。即如果史诗在此之前已经存在于数据库中,那么它将显示是否未更新:

SELECT d.epic, max(d.date)
FROM data as d
WHERE d.epic NOT IN (
   SELECT d2.epic 
   FROM data as d2 
   WHERE d2.date = '2019-05-08'
)
GROUP BY d.epic
ORDER BY d.epic