Я работаю над ОБНОВЛЕНИЕМ из запроса SELECT из текущих данных COVID-19 с сайта NY Times GitHub по номеру https://github.com/nytimes/covid-19-data/archive/master.zip. Это данные CSV с 5 столбцами (дата, округ, штат, FIPS (5-символьный географический идентификатор c, который иногда имеет начальные 0, а также имеет некоторые значения NULL), случаи и случаи смерти). Проблема состоит в том, что случаи и смертность накапливаются. Проблема заключалась в том, чтобы попытаться реорганизовать данные по дате, состоянию и округу, а затем определять количество новых случаев и новых смертей каждый день. Первой мыслью было сделать это с помощью курсора, что заняло навсегда. Здесь хитроумный автор предложил самостоятельно объединить таблицу импорта с добавленным RowID и отменить установку RowID на 1 в предложении WHERE, следовательно:
T1 LEFT OUTER JOIN T2
ON T1.Row_ID - 1 = T2.Row_ID
Следующая задача заключалась в условном вычитании случаи / смерти предыдущего дня за текущий день. Было три случая, чтобы иметь дело с 1. Первая строка объединения, где предыдущий день был НЕДЕЙСТВИТЕЛЕН - это требовало, чтобы значения первой строки были значениями текущего дня. 2. Когда строка предыдущего дня была из другого штата и / или округа, значения текущего дня соответствуют значениям текущего дня (как 1 выше). 3. Если штат и округ были такими же, как и в предыдущий день, было выполнено простое вычитание
CASE
WHEN T2.Row_ID IS NULL THEN T1.Total_Cases
WHEN (T1.State <> T2.State) OR (T1.County <> T2.County) THEN T1.Total_Cases
ELSE T1.Total_Cases - T2.Total_Cases
END
В синтаксисе SQL -Server, весь оператор:
UPDATE COVID_19.dbo.US_Counties
SET
New_Cases = New_Values.New_Cases1,
New_Deaths = New_Values.New_Deaths1
FROM (
SELECT
T1.Row_ID,
CASE
WHEN T2.Row_ID IS NULL THEN T1.Total_Cases
WHEN (T1.State <> T2.State) OR (T1.County <> T2.County) THEN T1.Total_Cases
ELSE T1.Total_Cases - T2.Total_Cases
END AS New_Cases1,
CASE
WHEN T2.Row_ID IS NULL THEN T1.Total_Deaths
WHEN (T1.State <> T2.State) OR (T1.County <> T2.County) THEN T1.Total_Deaths
ELSE T1.Total_Deaths - T2.Total_Deaths
END AS New_Deaths1
FROM COVID_19.dbo.US_Counties T1
LEFT OUTER JOIN COVID_19.dbo.US_Counties T2
ON T1.Row_ID - 1 = T2.Row_ID) AS New_Values
WHERE COVID_19.dbo.US_Counties.Row_ID = New_Values.Row_ID;
Это выполнено быстро (1 се c?) На SQL -Сервер с 80000 строк
Я переписал это для MySQL как:
UPDATE covid_19.us_counties
SET
New_Cases = New_Values.New_Cases1,
New_Deaths = New_Values.New_Deaths1
FROM (
SELECT
T1.Row_ID,
CASE
WHEN T2.Row_ID IS NULL THEN T1.Tot_Cases
WHEN (T1.State <> T2.State) OR (T1.County <> T2.County) THEN T1.Tot_Cases
ELSE T1.Tot_Cases - T2.Tot_Cases
END AS New_Cases1,
CASE
WHEN T2.Row_ID IS NULL THEN T1.Tot_Deaths
WHEN (T1.State <> T2.State) OR (T1.County <> T2.County) THEN T1.Tot_Deaths
ELSE T1.Tot_Deaths - T2.Tot_Deaths
END AS New_Deaths1
FROM covid_19.us_counties T1
LEFT JOIN covid_19.us_counties T2
ON T1.Row_ID - 1 = T2.Row_ID) AS New_Values
WHERE us_counties.Row_ID = New_Values.Row_ID;
К сожалению, это продолжало бросать ошибка непосредственно перед
FROM (
В конце концов, я переписал это без FROM как
UPDATE
covid_19.us_counties,
(SELECT
T1.Row_ID,
CASE
WHEN T2.Row_ID IS NULL THEN T1.Total_Cases
WHEN (T1.State <> T2.State) OR (T1.County <> T2.County) THEN T1.Total_Cases
ELSE T1.Total_Cases - T2.Total_Cases
END AS New_Cases1,
CASE
WHEN T2.Row_ID IS NULL THEN T1.Total_Deaths
WHEN (T1.State <> T2.State) OR (T1.County <> T2.County) THEN T1.Total_Deaths
ELSE T1.Total_Deaths - T2.Total_Deaths
END AS New_Deaths1
FROM covid_19.us_counties T1
LEFT JOIN covid_19.us_counties T2
ON T1.Row_ID - 1 = T2.Row_ID) AS New_Values
SET
covid_19.us_counties.New_Cases = New_Values.New_Cases1,
covid_19.us_counties.New_Deaths = New_Values.New_Deaths1
WHERE covid_19.us_counties.Row_ID = New_Values.Row_ID;
Это на самом деле сработало и выполнено за 4,4 секунды
Похоже, что результаты теперь то же самое для SQL -Server и MySQL. Мой вывод из этого заключается в том, что что-то не «напрямую» переводится, и функция автозаполнения в SQL -Server с более надежной раскраской ключевых слов и волнистыми красными подчеркиваниями и более полными сообщениями об ошибках действительно облегчает кодирование, что редактор в MySQL.
Буду признателен за любые мысли о самом SQL и о лучших инструментах редактирования (IDE?) специально для MySQL.
Заранее спасибо ...