我有一个脚本,使用一堆with子句来得出一些结果,然后我想把这个结果写在一个表中.我无法理解它,有人能指出我正确的方向吗?
这是一个简化的例子,表明我想做什么:
with comp as (
select *, 42 as ComputedValue from mytable where id = 1
)
update t
set SomeColumn = c.ComputedValue
from mytable t
inner join comp c on t.id = c.id
Run Code Online (Sandbox Code Playgroud)
真实的东西有很多with子句都互相引用,所以实际使用with子句的任何建议都比将其重构为嵌套子查询更受欢迎.
提前致谢,
格特 - 扬
有谁知道一种真正的声明性语言?我正在寻找的行为类似于Excel所做的,我可以在哪里定义变量和公式,并在输入发生变化时更改公式的结果(没有自己再次设置答案)
我正在寻找的行为最好用这个伪代码显示:
X = 10 // define and assign two variables
Y = 20;
Z = X + Y // declare a formula that uses these two variables
X = 50 // change one of the input variables
?Z // asking for Z should now give 70 (50 + 20)
Run Code Online (Sandbox Code Playgroud)
我已经尝试过很多语言,比如F#,python,matlab等,但是每次尝试这个都会得到30而不是70.从命令的角度来看,这是正确的,但我正在寻找一个如果你知道我的意思,更多的角色行为.
这只是一个非常简单的计算.当事情变得更加困难时,它应该自动处理诸如递归和memoization之类的东西.
下面的代码显然可以在C#中运行,但它只是为了工作的代码,我正在寻找更多的东西,没有那些"技术噪音"
class BlaBla{
public int X {get;set;} // this used to be even worse before 3.0
public int Y {get;set;}
public int Z {get{return X + Y;}}
} …Run Code Online (Sandbox Code Playgroud) programming-languages domain-driven-design functional-programming lazy-evaluation
我想以某种方式撰写功能.请考虑伪代码中的这两个函数(不是F#)
F1 = x + y
F2 = F1 * 10 // note I did not specify arguments for F1, 'reverse curry' for lack of a better word
Run Code Online (Sandbox Code Playgroud)
我希望F#做的是弄清楚,因为
let F1 x y = x + y
//val F1 : int -> int -> int
Run Code Online (Sandbox Code Playgroud)
代码let F2 = F1 * 10会给我与F1:相同的签名val F2 : int -> int -> int,并且调用F2 2 3将导致50:(2 + 3)*10.这将是相当聪明的...
发生的事情是完全不同的.第一行符合预期:
let F1 x y = x + y
//val F1 : …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Protobuf-net来保存数据并将数据加载到磁盘但却卡住了.
我有一个我需要处理的资产组合,我希望能够尽快做到这一点.我已经可以从CSV读取,但使用二进制文件会更快,所以我正在研究Protobuf-Net.
我无法将所有资源都放入内存中,因此我想将它们流式传输,而不是将它们全部加载到内存中.
所以我需要做的是将一大组记录暴露为IEnumerable.这可能与Protobuf-Net有关吗?我已经尝试了几件事但却无法让它运行起来.
序列化似乎有效,但我无法再次读取它们,我得到0资产.有人能指出我正确的方向吗?查看了Serializer类中的方法,但找不到任何涵盖此案例的方法.我这个用例由Protobuf-net支持?我顺便使用V2.
提前致谢,
格特 - 扬
这是我尝试的一些示例代码:
public partial class MainWindow : Window {
// Generate x Assets
IEnumerable<Asset> GenerateAssets(int Count) {
var rnd = new Random();
for (int i = 1; i < Count; i++) {
yield return new Asset {
ID = i,
EAD = i * 12345,
LGD = (float)rnd.NextDouble(),
PD = (float)rnd.NextDouble()
};
}
}
// write assets to file
private void Write(string path, IEnumerable<Asset> assets){
using (var file = File.Create(path)) …Run Code Online (Sandbox Code Playgroud) 我将数据从进程输出到csv.我将中间结果存储在数据类中,该数据类还具有将数据输出到字符串的方法,以便将其写入文件.
Class DataClass {
// the actual data
public double Value1 { get; set; }
public double Value2 { get; set; }
public double Value3 { get; set; }
// return headers for this dataclass (called once)
public static string Headers { get { return "Value1\tValue2\tValue3"; } }
// no decimals needed (keep filesize smaller, numbers are millions and up)
static NumberFormatInfo nfi = new NumberFormatInfo() { NumberDecimalDigits = 0 };
// this returns a string with the values for …Run Code Online (Sandbox Code Playgroud) 有人可以帮助我漂浮在这里吗?对于F#来说仍然是新手,实际上是第一次尝试使用它来处理严重的事情,但却陷入了这个nOOb问题.
我有一个类型的资产
type Asset(line:string) =
let fields = line.Split(',')
member this.EAD = Double.Parse(fields.[8])
Run Code Online (Sandbox Code Playgroud)
然后我将一个csv文件暴露为seq <Asset>:
'data'这里是文件中行的seq <string>
let assets = Seq.map(fun line -> Asset(line)) data
Run Code Online (Sandbox Code Playgroud)
现在我想获得这些资产的总EAD,但是我收到了一个错误
'This value is not a function and cannot be applied'.
Run Code Online (Sandbox Code Playgroud)
这是我尝试过的一些事情:
let totEAD = Seq.sum(a.EAD) assets // first try
let totEAD = Seq.sum(fun(a)->a.EAD) assets // pretty sure this is a function..
let getEad(a:Asset) = a.EAD // val getEad : Asset -> float ... is it a val of a function?
let x = Seq.sum(fun …Run Code Online (Sandbox Code Playgroud) 我有一个带有几个按钮的WPF表单,对于每个按钮,我有错误处理代码:
try {bla bla}
catch(Exception e){
more bla
}
Run Code Online (Sandbox Code Playgroud)
有什么方法可以在应用程序级别设置一些东西,或者只捕获所有未捕获的错误并显示一些通用消息/记录错误的东西?现在我必须为每个按钮创建处理,以便代码不会崩溃.它是一个内部应用程序,所以只显示从那里抛出的消息就足够了.之后,应用程序将等待下一次按钮单击,因此之后不必执行任何操作.
现在有如此多的重复代码,想知道是否有某种方法来整合它,并且只处理有特定方法来处理特定错误的情况.
关心Gert-Jan
简单的问题,我认为这不可能,但之前一直感到惊讶.
我有一个包含各种数学函数的库,让我们举一个非常简单的示例floorcap:
class MathLib {
public static double floorcap(double floor, double value, double cap) {
return Math.Min(Math.Max(floor, value), cap);
}
}
Run Code Online (Sandbox Code Playgroud)
在另一个类的另一个方法中,我只想输入
var mat_adjusted = floorcap(1, maturity, 5);
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为它没有在这个类中声明,它在库中.它让我打字
var mat_adjusted = MathLib.floorcap(1, maturity, 5);
Run Code Online (Sandbox Code Playgroud)
这会给代码增加噪音.我可以缩短它
using m = MyMathLibrary.MathLib;
.. yadayada
var mat_adjusted = m.floorcap(1, maturity, 5);
Run Code Online (Sandbox Code Playgroud)
但是,我仍然不想一直输入类名.那可能吗?我也用F#编写代码,你有点习惯在一段时间后不必拼出类型/模块等.当我不得不写C#时,这件事让我感到恼火(一点点),因为它会分散注意力的东西.
这里有很多功能,当你需要调用一些嵌套的函数时,所有这些点和类名都会加起来.我喜欢我的代码尽可能干净.
提前致谢,
格特 - 扬
首次使用F#进行生产,需要一些帮助.请参阅此代码,我在每行添加了警告作为注释:
type AssetClass =
| Corp
| Corp_SME
| Res_Mort
| Qual_Ret
| Ret_Oth
let Correlation assetClass pd sales =
match assetClass with
| Corp -> 0.12
| CORP_SME -> 0.24 // warning FS0049: Uppercase variable identifiers
| Res_Mort -> 0.15 // warning FS0026: This rule will never be matched
| Qual_Ret -> 0.04 // warning FS0026: This rule will never be matched
| Ret_Oth -> 0.03 // warning FS0026: This rule will never be matched
Run Code Online (Sandbox Code Playgroud)
我检查了它并没有虚张声势,第三个和其他情况确实被忽略了.我没有到这里来的是什么?(我在实际实现中使用的pd和销售输入,我在这里省略了公式.)
我想要做的是使用区分联合,因为我将在C#中使用枚举,然后打开它.所以在C#中我会输入这个:
enum AssetClass …Run Code Online (Sandbox Code Playgroud) 我有一个函数,我想将一个浮点数列表转换为另一个浮点数,其中每个元素我想要有x%的元素我溢出到元素i + 1
例:
let p3 = [0.1; 0.2; 0.4; 0.2; 0.1]
Run Code Online (Sandbox Code Playgroud)
那么p3_s应该是:
[0.05; 0.15; 0.3; 0.3; 0.2]
Run Code Online (Sandbox Code Playgroud)
为此,我将每个元素的一半添加到下一个元素中.
现在我想出了这个,但只适用于5号列表:
// create list
let p3 = [0.1; 0.2; 0.4; 0.2; 0.1]
let shiftList orgList shift =
// chop list up in tuples of what stays and what moves
let ms = orgList |> List.map (fun p-> (p * shift, p * (1.0-shift)))
// map new list
ms |> List.mapi (fun i (move, stay) ->
match i …Run Code Online (Sandbox Code Playgroud) 我有一段代码可以对资产进行计算.有数百万,所以我想在流中计算所有内容.我目前的'管道'看起来像这样:
我有一个作为Datareader执行的查询.
然后我的Asset类有一个接受IDataReader的构造函数;
Public Asset(IdataReader rdr){
// logic that initiates fields
}
Run Code Online (Sandbox Code Playgroud)
以及将IDataReader转换为IEnumerable <Asset>的方法
public static IEnumerable<Asset> ToAssets(IDataReader rdr) {
// make sure the reader is in the right formt
CheckReaderFormat(rdr);
// project reader into IEnumeable<Asset>
while (rdr.Read()) yield return new Asset(rdr);
}
Run Code Online (Sandbox Code Playgroud)
然后将其传递给执行实际计算的函数,然后将其投影到IEnumerable <Asnwer>中
然后得到一个包装器将Answers公开为IDataReader,然后将其传递给OracleBulkCopy并将流写入数据库.
到目前为止它的工作就像一个魅力.由于设置,我可以将DataReader交换为从文件读取的IEnumerable,或将结果写入文件等.所有这些都取决于我如何将类/函数串在一起.
现在:有几件事我可以计算,例如除了正常的答案我可以有一个DebugAnswer类,它也输出一些中间数字进行调试.所以我想做的是将IEnumerable投影到几个输出流中,这样我就可以把'听众'放在那些上.这样我就不必多次查看数据了.我怎样才能做到这一点?有点像有几个事件,然后只有附加了一个听众才会触发某些代码.
有时我也会写入数据库,但也会写入zip文件,以保留结果的备份.那么我想在IEnumerable上有2个'听众'.一个项目是IDataReader,另一个项目直接写入文件.
如何输出多个输出流以及如何在一个输出流上放置多个侦听器?是什么让我组合这样的数据流?
编辑
所以我想做的一些伪代码:
foreach(Asset in Assets){
if(DebugListener != null){
// compute
DebugAnswer da = new DebugAnswer {result = 100};
yield da to DebugListener; // so instead of yield return yield to …Run Code Online (Sandbox Code Playgroud) 目前我们在PL/SQL中编写了很多函数(普通CDF,反CDF,Vasicek和各种衍生函数),但它们非常慢.
通过在C#中编写了一些内容的工作站上传输数据,然后批量插入结果,我可以获得更好的性能.然而,这种方法使网络成为瓶颈,如果我可以通过在Oracle DB中具有更快的功能来"将木材放在木材中",那将会好得多.
我想看看如何通过在c(++)或Java(或任何其他替代方案)中编写代码来加快速度.这里有没有人有这方面的经验?希望你们中的一个人尝试过所有方法,并且可以解释哪些方法总体上最好.
这里更复杂的是IT很忙,所以如果我想要放弃使用DB上的某些功能,我需要做一个坚实的案例.我不能在那个盒子上玩很多东西,否则我会这样做.
我们使用的是Oracle Database 11g企业版11.2.0.2.0版 - 64位生产版
提前致谢,
格特 - 扬
编辑
这是一个函数的例子,它是Cody的Normal CDF.
这和之间的差cume_dist即cume_dist发现一组行中的分布.我只需要将概率转换为标准偏差并返回(很多次),就像Excel中的NORMDIST和NORMINV函数一样.
function stdnormal_cdf(u number) return number is
z number;
y Number;
begin
y:=abs(u);
if y <= 0.6629126073623883041257915894732959743297 then
z:=y * y;
y:=u * ((((1.161110663653770e-002 * z + 3.951404679838207e-001) * z + 2.846603853776254e + 001) * z + 1.887426188426510e + 002) * z + 3.209377589138469e + 003)/((((1.767766952966369e-001 * z + 8.344316438579620) * …Run Code Online (Sandbox Code Playgroud) 我遇到了一些我不理解的Array.map2.
考虑以下代码:
type r1 = {
v1 : int
X : int
}
type r2 = {
v1 : int
Y : int
}
let a1 = [|{v1=1; X=1}; {v1=2; X=2}|] // val a1 : r1 [] ...
let a2 = [|{v1=100; Y=100}; {v1=200; Y=200}|] // val a2 : r2 [] ...
Array.map2 (fun x1 x2 -> (x1.X, x2.Y)) a1 a2 // works as expected
Array.map2 (fun x1 x2 -> (x1.v1, x2.v1)) a1 a2 // error FS0001: Type mismatch. Expecting …Run Code Online (Sandbox Code Playgroud)