小编gjv*_*amp的帖子

使用with子句更新语句

我有一个脚本,使用一堆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子句的任何建议都比将其重构为嵌套子查询更受欢迎.

提前致谢,

格特 - 扬

sql oracle

39
推荐指数
2
解决办法
12万
查看次数

真正的陈述性语言?

有谁知道一种真正的声明性语言?我正在寻找的行为类似于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

21
推荐指数
4
解决办法
1486
查看次数

反向cur ??

我想以某种方式撰写功能.请考虑伪代码中的这两个函数(不是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)

f# functional-programming currying higher-order-functions

7
推荐指数
1
解决办法
1850
查看次数

使用Protobuf-net将大数据文件作为IEnumerable流式传输

我正在尝试使用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)

c# protobuf-net

7
推荐指数
1
解决办法
3259
查看次数

string.Format忽略NumberFormatInfo?

我将数据从进程输出到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)

.net c#

6
推荐指数
1
解决办法
3574
查看次数

如何在seq <type>上总结一个成员?

有人可以帮助我漂浮在这里吗?对于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)

f#

4
推荐指数
1
解决办法
1336
查看次数

在应用程序级别上捕获所有错误处理?

我有一个带有几个按钮的WPF表单,对于每个按钮,我有错误处理代码:

try {bla bla} 
catch(Exception e){
  more bla
}
Run Code Online (Sandbox Code Playgroud)

有什么方法可以在应用程序级别设置一些东西,或者只捕获所有未捕获的错误并显示一些通用消息/记录错误的东西?现在我必须为每个按钮创建处理,以便代码不会崩溃.它是一个内部应用程序,所以只显示从那里抛出的消息就足够了.之后,应用程序将等待下一次按钮单击,因此之后不必执行任何操作.

现在有如此多的重复代码,想知道是否有某种方法来整合它,并且只处理有特定方法来处理特定错误的情况.

关心Gert-Jan

c# wpf

4
推荐指数
1
解决办法
9107
查看次数

有没有办法调用静态函数而不必提及类型?

简单的问题,我认为这不可能,但之前一直感到惊讶.

我有一个包含各种数学函数的库,让我们举一个非常简单的示例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#时,这件事让我感到恼火(一点点),因为它会分散注意力的东西.

这里有很多功能,当你需要调用一些嵌套的函数时,所有这些点和类名都会加起来.我喜欢我的代码尽可能干净.

提前致谢,

格特 - 扬

c#

4
推荐指数
1
解决办法
142
查看次数

与受歧视的联盟相匹配

首次使用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)

enums f# pattern-matching discriminated-union

3
推荐指数
1
解决办法
647
查看次数

将不同的函数映射到列表中的第一个和最后一个元

我有一个函数,我想将一个浮点数列表转换为另一个浮点数,其中每个元素我想要有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)

为此,我将每个元素的一半添加到下一个元素中.

  • 0.1变为0.05,因为它给下一个0.05,没有先前的元素
  • 0.2变为0.15,因为它给下一个0.1,从第一个得到0.05
  • 等等
  • 最后0.1变为0.2,因为它来自前一个.01.没有下一个元素.

现在我想出了这个,但只适用于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)

f# list

3
推荐指数
1
解决办法
694
查看次数

产生多个IEnumebles

我有一段代码可以对资产进行计算.有数百万,所以我想在流中计算所有内容.我目前的'管道'看起来像这样:

我有一个作为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)

c# stream

2
推荐指数
1
解决办法
747
查看次数

Oracle中计算密集型函数的最快语言

目前我们在PL/SQL中编写了很多函数(普通CDF,反CDF,Vasicek和各种衍生函数),但它们非常慢.

通过在C#中编写了一些内容的工作站上传输数据,然后批量插入结果,我可以获得更好的性能.然而,这种方法使网络成为瓶颈,如果我可以通过在Oracle DB中具有更快的功能来"将木材放在木材中",那将会好得多.

我想看看如何通过在c(++)或Java(或任何其他替代方案)中编写代码来加快速度.这里有没有人有这方面的经验?希望你们中的一个人尝试过所有方法,并且可以解释哪些方法总体上最好.

这里更复杂的是IT很忙,所以如果我想要放弃使用DB上的某些功能,我需要做一个坚实的案例.我不能在那个盒子上玩很多东西,否则我会这样做.

我们使用的是Oracle Database 11g企业版11.2.0.2.0版 - 64位生产版

提前致谢,

格特 - 扬

编辑

这是一个函数的例子,它是CodyNormal CDF.

这和之间的差cume_distcume_dist发现一组行中的分布.我只需要将概率转换为标准偏差并返回(很多次),就像Excel中的NORMDISTNORMINV函数一样.

    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)

oracle

2
推荐指数
1
解决办法
753
查看次数

Array.map2对记录进行类型推断

我遇到了一些我不理解的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)

f#

1
推荐指数
1
解决办法
293
查看次数