我有一个名为mydb的MySQL数据库,其中存储了以下数据库的每日股价: 名为data的表中的423家公司。表数据包含以下列:
`epic`, `date`, `open`, `high`, `low`, `close`, `volume`
epic
和date
是主键对。
我每天使用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更新。问题是发现不成对的值并不容易。 对于此问题的任何帮助将不胜感激。
答案 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