我正在将我的sql查询转换为mysql查询,但所有具有WITH子句的查询都失败了。
以下是查询:
WITH CTE AS (
SELECT sto.NDate AS NDate,sto.NStockName AS StkName,sto.NClosingPrice AS StkClosingPrice, sto.NVolume AS StkVolume,
ind.NStockName AS IndName,ind.NClosingPrice AS IndClosingPrice, ind.NVolume AS IndVolume,
rownum = ROW_NUMBER() OVER (PARTITION BY sto.NStockName ORDER BY sto.NDate)
FROM equitystockoptions_nse AS sto
JOIN equitystockoptions_indices AS ind ON sto.NDate = ind.NDate
WHERE ind.NStockName='NIFTY' AND STR_TO_DATE(DATE_FORMAT(sto.NDate,'%m/%d/%Y')) >= DATE_FORMAT(v_fromdate,'%m/%d/%Y') AND STR_TO_DATE(DATE_FORMAT(sto.NDate,'%m/%d/%Y')) <= DATE_FORMAT(v_todate,'%m/%d/%Y')
)
SELECT curr.NDate,curr.StkName,curr.StkClosingPrice, curr.StkVolume, curr.IndName, curr.IndClosingPrice, curr.IndVolume,
LOG(curr.StkClosingPrice / prev.StkClosingPrice) AS StkReturnOnLog, LOG(curr.IndClosingPrice / prev.IndClosingPrice) AS IndReturnOnLog
FROM CTE curr
INNER JOIN CTE PREV ON prev.rownum = curr.rownum - 1 AND curr.StkName = prev.StkName
ORDER BY StkName, NDate;
对此转换的任何建议表示赞赏。
答案 0 :(得分:0)
WITH允许为内联视图(FROM子句中使用的子查询)指定名称。据我所知MySQL不支持WITH,所以你可以用实际的子查询替换所有“CTE”引用:
SELECT curr.NDate,curr.StkName,curr.StkClosingPrice, curr.StkVolume,
curr.IndName, curr.IndClosingPrice, curr.IndVolume,
LOG(curr.StkClosingPrice / prev.StkClosingPrice) AS StkReturnOnLog,
LOG(curr.IndClosingPrice / prev.IndClosingPrice) AS IndReturnOnLog
FROM (
SELECT sto.NDate AS NDate,sto.NStockName AS StkName,sto.NClosingPrice AS StkClosingPrice, sto.NVolume AS StkVolume,
ind.NStockName AS IndName,ind.NClosingPrice AS IndClosingPrice, ind.NVolume AS IndVolume,
rownum = ROW_NUMBER() OVER (PARTITION BY sto.NStockName ORDER BY sto.NDate)
FROM equitystockoptions_nse AS sto
JOIN equitystockoptions_indices AS ind ON sto.NDate = ind.NDate
WHERE ind.NStockName='NIFTY' AND STR_TO_DATE(DATE_FORMAT(sto.NDate,'%m/%d/%Y')) >= DATE_FORMAT(v_fromdate,'%m/%d/%Y') AND STR_TO_DATE(DATE_FORMAT(sto.NDate,'%m/%d/%Y')) <= DATE_FORMAT(v_todate,'%m/%d/%Y')
) curr
INNER JOIN (
SELECT sto.NDate AS NDate,sto.NStockName AS StkName,sto.NClosingPrice AS StkClosingPrice, sto.NVolume AS StkVolume,
ind.NStockName AS IndName,ind.NClosingPrice AS IndClosingPrice, ind.NVolume AS IndVolume,
rownum = ROW_NUMBER() OVER (PARTITION BY sto.NStockName ORDER BY sto.NDate)
FROM equitystockoptions_nse AS sto
JOIN equitystockoptions_indices AS ind ON sto.NDate = ind.NDate
WHERE ind.NStockName='NIFTY' AND STR_TO_DATE(DATE_FORMAT(sto.NDate,'%m/%d/%Y')) >= DATE_FORMAT(v_fromdate,'%m/%d/%Y') AND STR_TO_DATE(DATE_FORMAT(sto.NDate,'%m/%d/%Y')) <= DATE_FORMAT(v_todate,'%m/%d/%Y')
) PREV ON prev.rownum = curr.rownum - 1 AND curr.StkName = prev.StkName
ORDER BY StkName, NDate;