A股数据日级前复权数据补全

根据上一篇下载的数据,现在每天更新day数据

需要保证股票当日新上市下载,退市保留,停牌复牌识别、是否发生复权(决定前复权价格是否变化)

数据更新

1、大盘指数数据(399001, 399005, 399006, 399300,999999)

## Pythonimport pandas as pd
import numpy as np
import tushare as ts
import os
import shutil

os.getcwd()
os.chdir("C:/Users/~~~/Desktop/数据")   #修改当前工作目录

## 寻找上一数据日期
last_data_date = max([int(i[4:]) for i in os.listdir("ts大盘数据")])
## 所有交易日期
all_date = [int(i.replace("-", "")) for i in ts.trade_cal()["calendarDate"][ts.trade_cal()["isOpen"] == 1]]

## 寻找上一交易日期
def func(x, lst):
    i = 0
    while(lst[i] <= x):
        i += 1
    return lst[i-1]
last_data_day = str(func(last_data_date, all_date))

## 更新到新日期,创建新文件夹
new_date = "20171221"
os.mkdir("ts大盘数据/大盘数据"+new_date)
shutil.copyfile("ts大盘数据/大盘数据"+str(last_data_date)+"/"+"stock_info.csv","ts大盘数据/大盘数据"+new_date+"/"+"stock_info.csv")

## 获取数据起始与终止日期
start_date = last_data_day[0:4]+"-"+last_data_day[4:6]+"-"+last_data_day[6:8]
end_date = new_date[0:4]+"-"+new_date[4:6]+"-"+new_date[6:8]

## 大盘补全
## 399001, 399005, 399006, 399300
dapan_code = ["399001", "399005", "399006", "399300"]
for i in dapan_code:
    old_dapan = pd.read_csv("ts大盘数据/大盘数据"+str(last_data_date)+"/"+i+".csv", engine=‘python‘)

    new_dapan = ts.get_h_data(i, start=start_date, end=end_date,  index=True, pause=4)

    new_dapan.sort_index(inplace=True)
    new_dapan[["open", "high", "close", "low"]] = new_dapan[["open", "high", "close", "low"]]*10000
    new_dapan["date"] = new_dapan.index
    new_dapan["date"] = new_dapan["date"].astype(str).apply(lambda x:x.replace(‘-‘, ‘‘))
#     new_dapan.index = list(range(len(old_dapan)-1, len(old_dapan)+len(new_dapan)-1))
    new_dapan.columns = [‘open‘,‘high‘, ‘close‘, ‘low‘, ‘volumw‘, ‘turover‘, ‘date‘]
    if new_dapan.iloc[0, 4] == old_dapan.iloc[-1, 8]:
        new_dapan.drop(new_dapan.index[0], axis=0, inplace=True)
        dapan = old_dapan.append(new_dapan, ignore_index=True)
        dapan = dapan[old_dapan.columns]
        dapan.fillna(method=‘ffill‘,inplace=True)
        dapan.to_csv("ts大盘数据/大盘数据"+new_date+"/"+i+".csv", index=False)

## 000001 --> 999999 上证指数 (新浪财经对指数编号不同)
old_dapan = pd.read_csv("ts大盘数据/大盘数据"+str(last_data_date)+"/"+"999999.csv", engine=‘python‘)

start_date = last_data_day[0:4]+"-"+last_data_day[4:6]+"-"+last_data_day[6:8]
end_date = new_date[0:4]+"-"+new_date[4:6]+"-"+new_date[6:8]
new_dapan = ts.get_h_data("000001", start=start_date, end=end_date,  index=True, pause=4)

new_dapan.sort_index(inplace=True)
new_dapan[["open", "high", "close", "low"]] = new_dapan[["open", "high", "close", "low"]]*10000
new_dapan["date"] = new_dapan.index
new_dapan["date"] = new_dapan["date"].astype(str).apply(lambda x:x.replace(‘-‘, ‘‘))
new_dapan.columns = [‘open‘,‘high‘, ‘close‘, ‘low‘, ‘volumw‘, ‘turover‘, ‘date‘]

if new_dapan.iloc[0, 4] == old_dapan.iloc[-1, 8]:
  new_dapan.drop(new_dapan.index[0], axis=0, inplace=True)
  dapan = old_dapan.append(new_dapan, ignore_index=True)
  dapan = dapan[old_dapan.columns]
  dapan.fillna(method=‘ffill‘,inplace=True)
  dapan.to_csv("ts大盘数据/大盘数据"+new_date+"/"+"999999.csv", index=False)

2、A股股票数据与概括文件

## R## 自动补全函数
## new.date:补全截至时间
library(WindR)
library(xlsx)
library(data.table)
library(magrittr)
library(tcltk2)
# (.packages())

w.start()
setwd("C:/Users/~~~/Desktop/坴戋/华泰/数据")

## WindR获取数据规则:退市时期数据为NA,停牌时期数据以上一交易日收盘价补全?
## 文件夹内不能随便新建文件!!!

## 1.设置截至日期(若补当日数据,五点之后执行)
new.date <- "20171221"

end.date <- paste(substr(new.date, 1, 4), substr(new.date, 5, 6),
                  substr(new.date, 7, 8), sep = "-")

## 2.摘取当日在市股票代码
stock.code.df <- w.wset(‘sectorconstituent‘,
                        paste0("date=", end.date, ";sectorid=a001010100000000"))
if(stock.code.df$ErrorCode == 0){
  # if(gsub("-", "", as.Date(stock.code.df$Time)) == new.date){
  stock.code.sh.sz <- stock.code.df$Data$wind_code
  # }else{
  #   print("获取时间出错")
  # }
}else{
  print(paste0("获取数据出错,错误代码", stock.code.df$ErrorCode))
}
new.stock.code <- substr(stock.code.sh.sz, 1, 6)
# str(stock.code.sh.sz)

## 3.获取上一次数据日期
old.file.name <- gsub("股票数据", "", dir("股票数据"))
last.data.day <- old.file.name[which.max(old.file.name)] ## 是否需要改为数值型比较
## 4.数据上一次所有股票代码
old.stock.code <- gsub(".csv", "", dir(paste0("股票数据/股票数据", last.data.day)))

## 5.创建新的文件夹
dir.create(paste0("股票数据/股票数据", new.date))

## 6.股票补全部分

## 概括性文件变量
## 退市数据保留执行以下部分代码,不保留执行已有那一行注释代码
all.stock.code <- unique(c(new.stock.code, old.stock.code))
general.information <- data.frame(array(dim=c(length(all.stock.code), 5)))
# general.information <- data.frame(array(dim=c(length(stock.code.sh.sz), 5)))

colnames(general.information) <- c("stock.code", "stock.name", "type", "starttime", "endtime")

## 大盘日期
dapan.date <- read.csv(paste0("ts大盘数据/大盘数据", new.date, "/399300.csv"))$date

## 设置进度条
pb <- tkProgressBar("进度", "已完成 %", 0, 100) 

# i <- 3
# length(stock.code.sh.sz)
for(i in 1:length(stock.code.sh.sz)){
  if(new.stock.code[i] %in% old.stock.code){
    old.df <- fread(paste0("股票数据/股票数据", last.data.day, "/", new.stock.code[i], ".csv"),
                    header=TRUE, integer64="numeric", sep = ",")
    ## 寻找原数据中最后有交易数据的行数与日期
    if(old.df$volumw[nrow(old.df)] != 0){
      j <- nrow(old.df)
      last.trading.day <- old.df$date[j]
    }else{
      j <- nrow(old.df)
      while(old.df$volumw[j] == 0 & j > 0){
        j <- j - 1
      }
      last.trading.day <- old.df$date[j]
    }
    start.date <- paste(substr(last.trading.day, 1, 4), substr(last.trading.day, 5, 6),
                        substr(last.trading.day, 7, 8), sep = "-")

    new.data <- w.wsd(stock.code.sh.sz[i], "trade_code, sec_name, open, high, low, close,
                      volume, amt, free_turn,free_float_shares",
                      start.date, end.date, "unit=1;PriceAdj=F")
    if(new.data$ErrorCode == 0){
      if(any(is.na(new.data$Data))){
        ## 退市又复市
        if(any(is.na(new.data$Data[1, ]))){
          print(paste(stock.code.sh.sz[i], "退市又复市,但上个交易日数据获取为NA,仅输出新数据"))
          wind.df <- data.frame(array(dim=c(nrow(new.data$Data), 12)))
          colnames(wind.df) <- c("wind_code", "name", "date", "time", "open", "high", "low", "close",
                                 "volumw", "turover", "free_turn", "free_float_shares")
          wind.df[, 1]    <- new.data$Code
          wind.df[, 2]    <- new.data$Data$SEC_NAME
          wind.df[, 3]    <- gsub("-", "", new.data$Data$DATETIME)
          wind.df[, 4]    <- 151500000
          wind.df[, 5:8]  <- new.data$Data[4:7] * 10000
          wind.df[, 9:12] <- new.data$Data[8:11]
          wind.df <- wind.df[!(is.na(wind.df$open)), ]
        }else if(all(round(unlist(old.df[j, 5:8])) == round(unlist(new.data$Data[1, 4:7]*10000)))){
          ## 退市复市股权未变动
          print(paste(stock.code.sh.sz[i], "退市又复市,股权未变动"))
          wind.df <- data.frame(array(dim=c(nrow(old.df)+nrow(new.data$Data)-1, 12)))
          colnames(wind.df) <- c("wind_code", "name", "date", "time", "open", "high", "low", "close", "volumw",
                                 "turover", "free_turn", "free_float_shares")
          wind.df[1:nrow(old.df), ] <- old.df[, 1:12] # 14变为12
          wind.df[(nrow(old.df)+1):nrow(wind.df), 1]    <- new.data$Code
          wind.df[(nrow(old.df)+1):nrow(wind.df), 2]    <- new.data$Data$SEC_NAME[-1]
          wind.df[(nrow(old.df)+1):nrow(wind.df), 3]    <- gsub("-", "", new.data$Data$DATETIME)[-1]
          wind.df[(nrow(old.df)+1):nrow(wind.df), 4]    <- 151500000
          wind.df[(nrow(old.df)+1):nrow(wind.df), 5:8]  <- new.data$Data[-1, 4:7] * 10000
          wind.df[(nrow(old.df)+1):nrow(wind.df), 9:12] <- new.data$Data[-1, 8:11]
          wind.df <- wind.df[!(is.na(wind.df$open)), ]
          # 停牌重复行删去
          wind.df <- wind.df[!duplicated(wind.df$date), ]
        }else{
          ## 退市复市股权变动
          print(paste(stock.code.sh.sz[i], "退市又复市,股权变动"))
          wind.df <- data.frame(array(dim=c(nrow(old.df)+nrow(new.data$Data)-1, 12)))
          colnames(wind.df) <- c("wind_code", "name", "date", "time", "open", "high", "low", "close", "volumw",
                                 "turover", "free_turn", "free_float_shares")
          ## 以开盘价定复权因子
          ratio <- unlist(new.data$Data[1, 4]*10000 / old.df[j, 5])
          wind.df[1:nrow(old.df), 1:4]  <- old.df[, 1:4]
          wind.df[1:nrow(old.df), 5:8]  <- old.df[, 5:8] * ratio
          wind.df[1:nrow(old.df), 9:12] <- old.df[, 9:12]

          wind.df[(nrow(old.df)+1):nrow(wind.df), 1]    <- new.data$Code
          wind.df[(nrow(old.df)+1):nrow(wind.df), 2]    <- new.data$Data$SEC_NAME[-1]
          wind.df[(nrow(old.df)+1):nrow(wind.df), 3]    <- gsub("-", "", new.data$Data$DATETIME)[-1]
          wind.df[(nrow(old.df)+1):nrow(wind.df), 4]    <- 151500000
          wind.df[(nrow(old.df)+1):nrow(wind.df), 5:8]  <- new.data$Data[-1, 4:7] * 10000
          wind.df[(nrow(old.df)+1):nrow(wind.df), 9:12] <- new.data$Data[-1, 8:11]
          wind.df <- wind.df[!(is.na(wind.df$open)), ]
          # 停牌重复行删去
          wind.df <- wind.df[!duplicated(wind.df$date), ]
        }
      }else{
        ## 是否停牌不影响,只需判断股权是否变动
        if(all(round(unlist(old.df[j, 5:8])) == round(unlist(new.data$Data[1, 4:7]*10000)))){
          ## 股权未变动
          wind.df <- data.frame(array(dim=c(nrow(old.df)+nrow(new.data$Data)-1, 12)))
          colnames(wind.df) <- c("wind_code", "name", "date", "time", "open", "high", "low", "close", "volumw",
                                 "turover", "free_turn", "free_float_shares")
          wind.df[1:nrow(old.df), ] <- old.df[, 1:12]
          wind.df[(nrow(old.df)+1):nrow(wind.df), 1]    <- new.data$Code
          wind.df[(nrow(old.df)+1):nrow(wind.df), 2]    <- new.data$Data$SEC_NAME[-1]
          wind.df[(nrow(old.df)+1):nrow(wind.df), 3]    <- gsub("-", "", new.data$Data$DATETIME)[-1]
          wind.df[(nrow(old.df)+1):nrow(wind.df), 4]    <- 151500000
          wind.df[(nrow(old.df)+1):nrow(wind.df), 5:8]  <- new.data$Data[-1, 4:7] * 10000
          wind.df[(nrow(old.df)+1):nrow(wind.df), 9:12] <- new.data$Data[-1, 8:11]
          wind.df <- wind.df[!(is.na(wind.df$open)), ]
          # 停牌重复行删去
          wind.df <- wind.df[!duplicated(wind.df$date), ]
        }else{
          ## 股权变动
          print(paste(stock.code.sh.sz[i], "股权变动"))
          wind.df <- data.frame(array(dim=c(nrow(old.df)+nrow(new.data$Data)-1, 12)))
          colnames(wind.df) <- c("wind_code", "name", "date", "time", "open", "high", "low", "close", "volumw",
                                 "turover", "free_turn", "free_float_shares")
          ## 以开盘价定复权因子
          ratio <- unlist(new.data$Data[1, 4]*10000 / old.df[j, 5])
          wind.df[1:nrow(old.df), 1:4]  <- old.df[, 1:4]
          wind.df[1:nrow(old.df), 5:8]  <- old.df[, 5:8] * ratio
          wind.df[1:nrow(old.df), 9:12] <- old.df[, 9:12]

          wind.df[(nrow(old.df)+1):nrow(wind.df), 1]    <- new.data$Code
          wind.df[(nrow(old.df)+1):nrow(wind.df), 2]    <- new.data$Data$SEC_NAME[-1]
          wind.df[(nrow(old.df)+1):nrow(wind.df), 3]    <- gsub("-", "", new.data$Data$DATETIME)[-1]
          wind.df[(nrow(old.df)+1):nrow(wind.df), 4]    <- 151500000
          wind.df[(nrow(old.df)+1):nrow(wind.df), 5:8]  <- new.data$Data[-1, 4:7] * 10000
          wind.df[(nrow(old.df)+1):nrow(wind.df), 9:12] <- new.data$Data[-1, 8:11]
          wind.df <- wind.df[!(is.na(wind.df$open)), ]
          wind.df <- wind.df[!duplicated(wind.df$date), ]
        }
      }
    }else{
      print(paste0(stock.code.sh.sz[i], "获取数据出错,错误代码:", new.data$ErrorCode))
      break
    }
  }else{
    # 新上市股票
    print(paste(stock.code.sh.sz[i], "新上市股票"))
    start.date <- paste(substr(last.data.day, 1, 4), substr(last.data.day, 5, 6),
                        substr(last.data.day, 7, 8), sep = "-")

    new.data <- w.wsd(stock.code.sh.sz[i], "trade_code, sec_name, open, high, low, close, volume, amt,
                      free_turn, free_float_shares",
                      start.date, end.date, "unit=1;PriceAdj=F")
    if(new.data$ErrorCode == 0){
      wind.df <- data.frame(array(dim=c(nrow(new.data$Data), 12)))
      colnames(wind.df) <- c("wind_code", "name", "date", "time", "open", "high", "low", "close", "volumw",
                             "turover", "free_turn", "free_float_shares")
      wind.df[, 1]    <- new.data$Code
      wind.df[, 2]    <- new.data$Data$SEC_NAME
      wind.df[, 3]    <- gsub("-", "", new.data$Data$DATETIME)
      wind.df[, 4]    <- 151500000
      wind.df[, 5:8]  <- new.data$Data[4:7] * 10000
      wind.df[, 9:12] <- new.data$Data[8:11]
      wind.df         <- wind.df[!(is.na(wind.df$open)), ]
    }else{
      print(paste0(stock.code.sh.sz[i], "新上市股票获取数据出错,错误代码:", new.data$ErrorCode))
      break
    }
  }

  ## 输出部分
  if(nrow(wind.df) == 0){
    print(paste(stock.code.sh.sz[i], "数据出错(在市股票不可能全为NA导致数据框行为0)"))
  }else{
    if(any(is.na(wind.df))){
      print(paste(stock.code.sh.sz[i], "数据出错(数据中仍有NA)"))
    }else{
      if(any(wind.df[, 5:8] == 0)){
        print(paste(stock.code.sh.sz[i], "数据出错(数据中开高低收存在0)"))
      }else{
        if(any(table(wind.df$date) > 1)){
          print(paste(stock.code.sh.sz[i], "数据出错(数据中存在日期相同)"))
        }else{
          if(any(wind.df$date != sort(wind.df$date))){
            print(paste(stock.code.sh.sz[i], "数据出错(数据中日期顺序不对)"))
          }else{
            # 是否与大盘日期匹配,所有日期必须在大盘已有日期内
            if(all(wind.df$date %in% dapan.date)){
              first.date <- paste(substr(wind.df$date[1], 1, 4), substr(wind.df$date[1], 5, 6),
                                  substr(wind.df$date[1], 7, 8), sep = "-")
              test <- w.wsd(stock.code.sh.sz[i], "trade_code, sec_name, open, high, low, close, volume, amt,
                                                  free_turn, free_float_shares",
                            first.date, first.date, "unit=1;PriceAdj=F")
              if(all(round(test$Data[4:7]*10000) == round(wind.df[1, 5:8])) & test$Data$VOLUME == wind.df[1, 9]){
                general.information[i, 1] <- substr(stock.code.sh.sz[i], 1, 6)
                general.information[i, 2] <- wind.df$name[1]
                general.information[i, 3] <- substr(stock.code.sh.sz[i], 8, 9)
                general.information[i, 4] <- wind.df[1, 3]
                general.information[i, 5] <- wind.df[nrow(wind.df), 3]
                write.csv(wind.df, paste0("股票数据/股票数据", new.date, "/", new.stock.code[i], ".csv"),
                          row.names = FALSE)
              }else{
                print(paste(stock.code.sh.sz[i], "数据出错(数据补全与wind不同)"))
              }
            }else{
              print(paste(stock.code.sh.sz[i], "数据出错(数据中日期与大盘日期不符)"))
            }
          }
        }
      }
    }
  }
  rm(wind.df);rm(old.df);rm(j)
  info <- sprintf("已完成 %d%%", round(i*100/length(stock.code.sh.sz)))
  setTkProgressBar(pb, i*100/length(stock.code.sh.sz), sprintf("进度 (%s)", info), info)
}

## 关闭进度条
close(pb) 

## 退市数据继续保留,则执行下面代码
tuishi.row <- 1
for(i in 1:length(old.stock.code)){
  if(!(old.stock.code[i] %in% new.stock.code)){
    print(paste(stock.code.sh.sz, "仍然退市"))
    old.df <- fread(paste0("股票数据/股票数据", last.data.day, "/", new.stock.code[i], ".csv"),
                    header=TRUE, integer64="numeric", sep = ",")
    df <- old.df[, 1:12]
    write.csv(df, paste("股票数据/股票数据", new.date, "/", new.stock.code[i], ".csv", sep=""),
              row.names = FALSE)
    tuishi.row <- tuishi.row + 1
    general.information[length(stock.code.sh.sz)+tuishi.row, 1] <- old.stock.code[i]
    general.information[length(stock.code.sh.sz)+tuishi.row, 2] <- df$name[1]
    general.information[length(stock.code.sh.sz)+tuishi.row, 3] <- substr(df$wind_code[1], 8, 9)
    general.information[length(stock.code.sh.sz)+tuishi.row, 4] <- df[1, 3]
    general.information[length(stock.code.sh.sz)+tuishi.row, 5] <- df[nrow(df), 3]
  }
}

## 总概括文件中无NA时输出
if(all(!(is.na(general.information)))){
  write.xlsx(general.information, paste0("概括文件/概括文件", new.date, ".xlsx"), row.names = FALSE)
}else{
  print("总概况文件中存在NA,需查验")
}
时间: 2024-10-10 13:09:07

A股数据日级前复权数据补全的相关文章

A股数据day级前复权数据下载与存储

存储为3个文件夹:大盘数据.股票数据与概括文件 数据获取来源:股票数据来源于R中的WindR:大盘数据来源于python中的tushare(wind中指数似乎只有中证板块) 设置数据文件夹,代码中只需修改更新截止日期与工作路径,后面创建文件都无需手动操作 文件夹中文件不能随意变动,标红代码部分需要自己修改 股票数据中变量分别为股票代码.股票简称.日期.时间.开高低收(乘10000).交易量.交易额.转手率(基于自由流通股本).自由流通股本 初次获取数据 1.大盘指数数据(399001, 3990

【甘道夫】使用HIVE SQL实现推荐系统数据补全

需求 在推荐系统场景中,如果基础行为数据太少,或者过于稀疏,通过推荐算法计算得出的推荐结果很可能达不到要求的数量. 比如,希望针对每个item或user推荐20个item,但是通过计算只得到8个,剩下的12个就需要补全. 欢迎转载,请注明出处: http://blog.csdn.net/u010967382/article/details/39674047 策略 数据补全的具体策略是: 补全时机:在挖掘计算结束后,挖掘结果导入HBase(最终web系统从HBase取数据)前,进行数据补全,补全后

pandas 对数据帧DataFrame中数据的增删、补全及转换操作

1.创建数据帧 import pandas as pd df = pd.DataFrame([[1, 'A', '3%' ], [2, 'B'], [3, 'C', '5%']], index=['row_0', 'row_1', 'row_2'], columns=['col_0', 'col_1', 'col_2']) 2.增加行.列 数据帧DataFrame的每一行都可看作是一个对象,每一列都是该对象的不同属性.每行都具有多维度的属性,因此每行都可以看作是一个小的DataFrame:而每列

ASP.NET MVC 表单提交多层子级实体集合数据到控制器中

于遇到了项目中实体类嵌套多层子级实体集合,并且子级实体集合的数据需要提交保存到数据库中的问题.针对此情况需要进行一些特殊的处理才可以将整个 实体类及子级实体集合数据提交表单到控制器中,解决的方法是根据MVC视图中表单的命名规则来设置正确的子级实体集合所属的表单控件name属性,从而来 获取提交的集合数据. 在说明如何将表单中实体的子级实体集合数据提交到控制器中的问题前,我们需要了解MVC的对于数组和列表集合的表单提交方式(点击此链接进行查看). 定义多层嵌套实体和假设场景 首先我们根据情况进行分

处理百万级以上的数据提高查询速度的方法

处理百万级以上的数据提高查询速度的方法: 1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 3.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:     select id from t where num is null     可以在num上设置默认值0,确保表中num列没有

【springMVC】简单的前后端数据交流

最最常见两种,一则返回视图模板(文档),二则为json数据.就使用一个源代码文件来看看springmvc是怎么做到的. 1.UserController.java源代码文件 (这里额外的使用了fastjson架包来将对象解析为json) package com.zay; import com.alibaba.fastjson.JSON; import org.springframework.stereotype.Controller; import org.springframework.web

前后端数据交互方法

在此介绍几种常用的前后端数据交互方法,并给出使用建议.以提高前后端协同开发的效率. 此文章适合前后端协同开发经验不足的新手阅读. 目录: HTML赋值 JS赋值 script填充JSON AJAX获取JSON WebSocket实时传输数据 总结 HTML赋值 输出到 Element 的 value 或 data-name <input type="hidden" value="<?php echo $user_avatar;?>" /> &

处理千万级以上的数据提高查询速度的方法

处理千万级以上的数据提高查询速度的方法:1.应尽量避免在  where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描.2.对查询进行优化,应尽量避免全表扫描,首先应考虑在  where 及 order by 涉及的列上建立索引.3.应尽量避免在  where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:      select id from t where num is null      可以在num上设置默认值0,确保表中num列

kettle中访问前一行数据

 kettle中访问前一行数据 在kettle中,当需要访问数据流前一行数据时,很多人都是用javascript步骤的特性:实际上没有必要,不是说javascript步骤不好,主要是性能低,同时也增加了复杂度,因为写代码让javascript步骤难以理解,最好是使用kettle标准步骤实现.我们的原则是代码最小化,过程轻松. (The Analytic Query Step)分析查询步骤 TheAnalytic Query 步骤可以查找数据流中的前面行或后面行,并且取值到当前行,很多场合是非