Объем, обновляющий таблицу от строк от другой таблицы

Dask позволяет вам использовать панды непосредственно для операций, которые являются построчными (например, такими) или могут применяться по одному разделу за раз. Помните, что фрейм данных Dask состоит из набора фреймов данных Pandas.

Для случая с Пандами вы должны сделать это, основываясь на связанных вопросах:

df = pd.DataFrame([["A", "Z,Y"], ["B", "X"], ["C", "W,U,V"]], 
    columns=['var1', 'var2'])
df.drop('var2', axis=1).join(
    df.var2.str.split(',', expand=True).stack().reset_index(drop=True, level=1).rename('var2'))

, поэтому для Dask вы можете применить точно такой же метод через map_partitions, потому что каждая строка не зависит от всех остальных. , Возможно, это выглядело бы чище, если бы переданная функция была записана отдельно, а не как лямбда:

d = dd.from_pandas(df, 2)
d.map_partitions(
    lambda df: df.drop('var2', axis=1).join(
        df.var2.str.split(',', expand=True).stack().reset_index(drop=True, level=1).rename('var2')))

, если бы вы сделали .compute() для этого, вы бы получили точно такой же результат, как и для случая Панд. выше. Скорее всего, вы не захотите вычислить ваш массивный фрейм данных за один раз, но выполните дальнейшую обработку на нем.

8
задан Juan Mellado 1 May 2012 в 13:34
поделиться

5 ответов

UPDATE
    Employees E
SET
    E.LeadCount = (
        SELECT COUNT(L.EmployeeID)
        FROM Leads L
        WHERE L.EmployeeID = E.EmployeeID
    )
12
ответ дан 5 December 2019 в 06:11
поделиться

Вы собираетесь для проблемы синхронизации данных. Поскольку строки в таблице Leads вставлены, обновлены или удалены, необходимо обновить Сотрудников. Столбец LeadCount постоянно.

Лучшее решение не состояло бы в том, чтобы сохранить столбец LeadCount вообще, но повторно вычислить, количество ведет с агрегатным запросом SQL, поскольку Вам нужно значение. Тем путем это всегда будет корректно.

SELECT employeeID, COUNT(leadId) AS LeadCount
FROM Leads
GROUP BY employeeID;

Другое решение состоит в том, чтобы создать, включает таблицу Leads для ВСТАВКИ, ОБНОВЛЕНИЯ, и УДАЛИТЕ, так, чтобы Вы сохранили Сотрудников. Столбец LeadCount, текущий все время. Например, использование MySQL инициировало синтаксис:

CREATE TRIGGER leadIns AFTER INSERT ON Leads
FOR EACH ROW BEGIN
  UPDATE Employees SET LeadCount = LeadCount + 1 WHERE employeeID = NEW.employeeID;
END

CREATE TRIGGER leadIns AFTER UPDATE ON Leads
FOR EACH ROW BEGIN
  UPDATE Employees SET LeadCount = LeadCount - 1 WHERE employeeID = OLD.employeeID;
  UPDATE Employees SET LeadCount = LeadCount + 1 WHERE employeeID = NEW.employeeID;
END

CREATE TRIGGER leadIns AFTER DELETE ON Leads
FOR EACH ROW BEGIN
  UPDATE Employees SET LeadCount = LeadCount - 1 WHERE employeeID = OLD.employeeID;
END

Другая опция при использовании MySQL состоит в том, чтобы использовать синтаксис мультитаблицы UPDATE. Это - расширение MySQL SQL, это не портативно другим брендам RDBMS. Во-первых, сбросьте LeadCount во всех строках для обнуления, затем сделайте соединение к таблице Leads и увеличьте LeadCount в каждой строке, произведенной соединением.

UPDATE Employees SET LeadCount = 0;
UPDATE Employees AS e JOIN Leads AS l USING (employeeID)
  SET e.LeadCount = e.LeadCount+1;
9
ответ дан 5 December 2019 в 06:11
поделиться

Соединения работают то же на обновления (и удаляет) точно так же, как они делают для выборов (редактирование: в некотором популярном RDBMS, по крайней мере, *):

UPDATE Employees SET
  LeadCount = Leads.LeadCount
FROM Employee
JOIN (
  SELECT EmployeeId, COUNT(*) as LeadCount 
  FROM Leads 
  GROUP BY EmployeeId
) as Leads ON
  Employee.EmployeeId = Leads.EmployeeId  

СУММА (ОТЛИЧНЫЙ EmployeeId) не имеет никакого смысла - Вам просто нужно КОЛИЧЕСТВО (*).

  • ОБНОВЛЕНИЕ поддержки SQL Server MS... ОТ, и УДАЛЯЮТ... ОТ Синтаксиса, как делает MySql, но стандарт SQL-92 не делает. SQL-92 сделал бы, чтобы Вы использовали выражение строки. Я знаю, что DB2 поддерживает этот синтаксис, но не уверенный в любых других. Откровенно говоря, я нахожу версию SQL-92 сбивающей с толку - но стандарты и зубрилы теории будут утверждать, что ОТ синтаксиса нарушает реляционную теорию и может привести к непредсказуемым результатам с неточными пунктами СОЕДИНЕНИЯ или при переключении поставщиков RDBMS.
5
ответ дан 5 December 2019 в 06:11
поделиться

Покрытие сталью сверху и удаление зависимого подзапроса.

// create tmp -> TBL (EmpID, count)

insert into TBL 
   SELECT employeeID COUNT(employeeID) Di
   FROM Leads WHERE Leads.employeeId = Employees.employeeId GROUP BY EmployeeId
UPDATE Employees SET LeadCount = (
  SELECT count FROM TBL WHERE TBL.EmpID = Employees.employeeId
)

// drop TBL

РЕДАКТИРОВАНИЕ Это - "группа" не "отличный": b (благодарит Mark Brackett),

0
ответ дан 5 December 2019 в 06:11
поделиться
UPDATE Employees SET LeadCount = (
  SELECT Distinct(SUM(employeeID)) FROM Leads WHERE Leads.employeeId = Employees.employeeId
)
1
ответ дан 5 December 2019 в 06:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: