mysql - 如何在 RMySQL 上做累计和?在 phpMyAdmin 中工作,但在 R 中给出错误
问题描述
我需要通过添加 2 列中的值来找到累积频率,这就是我在 phpMyAdmin 上尝试的方式。但是当我尝试使用 R 语言时,它给了我一个错误。
SELECT time.month,
hotel.state,
hotel.name,
income AS 'Checkout Income',
booking.expected_income AS 'Future Income',
( @sumvariable := @sumvariable + income
+ booking.expected_income ) AS 'Cumulative Income'
FROM checkout
INNER JOIN booking
ON checkout.checkout_id = booking.bookings_id
INNER JOIN time
ON checkout.timeid = time.timeid
INNER JOIN hotel
ON checkout.hotelid = hotel.hotelid
WHERE hotel.category = '4-star'
这是我使用 RMySQL 从 R 得到的错误:
.local(conn, statement, ...) 中的错误:无法运行语句:您的 SQL 语法有错误;查看与您的 MariaDB 服务器版本相对应的手册,了解在第 2 行的 'SELECT time.month, hotel.state,income, booking.expected_In' 附近使用的正确语法
请帮帮我。
解决方案
SET ...; SELECT ...;
在 RMySQL 中,与 R DBI 系列中的大多数 API(ROracle、RPostgreSQL、RSQLite、odbc 等)一样,仅执行第一个语句的情况下,不支持多个 DDL/DML 语句,例如在同一个调用中。您可以拥有多个SELECT
,然后使用dbNextResult
. 在 PHPMyAdmin(一个 IDE)中,可以在查询窗口中运行多行甚至完整的 SQL 脚本。
因此,您将需要进行多次查询调用,一次用于初始化参数,然后一次用于运行查询:
dbSendQuery(con, 'SET @SumVariable := 0;') # PARAM SAVED IN SESSION
df <- dbGetQuery(con, 'SELECT ...original query...')
相关子查询
话虽如此,考虑一个使用相关聚合子查询的语句,由于多个JOIN
. 一旦 MySQL 在未来版本中支持 CTE,这可以显着减少。timeid
下面使用假定为唯一和升序的字段进行关联(WHERE
根据需要在子句中调整)。
SELECT time.month,
hotel.state,
hotel.name,
income AS 'Checkout Income',
booking.expected_income AS 'Future Income',
(SELECT SUM(income + sub_b.expected_income)
FROM checkout sub_c
INNER JOIN booking sub_b
ON sub_c.checkout_id = sub_b.bookings_id
INNER JOIN time sub_t
ON sub_c.timeid = sub_t.timeid
INNER JOIN hotel sub_h
ON sub_c.hotelid = sub_h.hotelid
WHERE sub_h.category = '4-star'
AND sub_t.time_id <= time.time_id) AS 'Cumulative Income'
FROM checkout
INNER JOIN booking
ON checkout.checkout_id = booking.bookings_id
INNER JOIN time
ON checkout.timeid = time.timeid
INNER JOIN hotel
ON checkout.hotelid = hotel.hotelid
WHERE hotel.category = '4-star'
ORDER BY time.time_id;
存储过程
或者,将多行保存在存储过程中并从 R 调用它。事实上,关于将 SQL 保存在应用程序代码(即 R)中或作为存储的效率、可维护性和可用性方面的优缺点一直存在争论。程序。
MySQL (运行一次)
DELIMITER // CREATE PROCEDURE my_stored_proc BEGIN SET ...; SELECT ...; END // DELIMITER ;
R
conn <- dbConnect(RMySQL::MySQL(), dbname="databasename", host="hostname", username="username", password="password") df <- dbGetQuery(conn, "CALL my_stored_proc()") dbDisconnect(conn)
推荐阅读
- javascript - 如何在 Gatsby 中将来自第三方 api 的数据设置为 siteMetaData?
- feathersjs - 你如何在feathersjs框架中实现基于mongodb的事务?
- php - 当我链接到其他页面时如何隐藏某些?
- python-3.x - http.client.ResponseNotReady:空闲
- python - 代码只读取 CSV 文件的第一行
- java - 加入 int 数组以创建大数组
- mongodb - MacOS 上的 Mongodb 连接失败
- java - 如何降低圈复杂度?
- arrays - MongoDB - 带有时间序列分桶的 MapReduce
- google-play-console - 退订 Google Play 管理中心“家庭计划”