标签: aggregate

为什么SQL聚合函数比Python和Java(或穷人的OLAP)慢得多

我需要一个真正的DBA的意见.Postgres 8.3在我的Macbook Pro上执行此查询需要200 ms,而Java和Python在20 ms(350,000行)内执行相同的计算:

SELECT count(id), avg(a), avg(b), avg(c), avg(d) FROM tuples;
Run Code Online (Sandbox Code Playgroud)

使用SQL数据库时这是正常的行为吗?

模式(该表包含对调查的响应):

CREATE TABLE tuples (id integer primary key, a integer, b integer, c integer, d integer);

\copy tuples from '350,000 responses.csv' delimiter as ','
Run Code Online (Sandbox Code Playgroud)

我用Java和Python编写了一些测试用于上下文,他们粉碎了SQL(纯Python除外):

java   1.5 threads ~ 7 ms    
java   1.5         ~ 10 ms    
python 2.5 numpy   ~ 18 ms  
python 2.5         ~ 370 ms
Run Code Online (Sandbox Code Playgroud)

即使sqlite3与Postgres竞争,尽管它假设所有列都是字符串(相比之下:即使只使用切换到数字列而不是Postgres中的整数导致10x减速)

我试过没有成功的调整包括(盲目地遵循一些网络建议):

increased the shared memory available to Postgres to 256MB    
increased the working memory to 2MB
disabled connection …
Run Code Online (Sandbox Code Playgroud)

python sql optimization olap aggregate

14
推荐指数
3
解决办法
5023
查看次数

如何在实体框架查询中连接字符串?

如何在实体框架4中连接字符串我有一个列中的数据,我想将字符串保存为逗号分隔的字符串,如"value1,value2,value3"是否有方法或操作员在EF4中执行此操作?示例:假设我有两列FruitFarms具有以下值:

  • 苹果
  • 香蕉
  • 草莓

如果我喜欢这个

var dataSource = this.context
    .Farms
    .Select(f => new
        {
            f.Id, 
            Fruits = string.Join(", ", f.Fruits)
        });

当然我会得到这个错误

LINQ to Entities无法识别方法'System.String Join(System.String,System.Collections.Generic.IEnumerable`1 [System.String])'方法,并且此方法无法转换为商店表达式.

这有什么解决方案吗?

sql entity-framework aggregate string-concatenation entity-framework-4

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

使用LINQ聚合的实体框架来连接字符串?

这对我来说很容易在TSQL中执行,但我只是坐在这里,试着让它在EF4中工作!

我有一个表,我们称之为TestData.它有字段,比如:DataTypeID,Name,DataValue.

DataTypeID, Name, DataValue
1,"Data 1","Value1"
1,"Data 1","Value2"
2,"Data 1","Value3"
3,"Data 1","Value4"
Run Code Online (Sandbox Code Playgroud)

我想对DataID/Name进行分组,并将DataValue连接成CSV字符串.期望的结果应包含 -

DataTypeID, Name, DataValues
1,"Data 1","Value1,Value2"
2,"Data 1","Value3"
3,"Data 1","Value4"
Run Code Online (Sandbox Code Playgroud)

现在,我正在努力做到这一点 -

var query = (from t in context.TestData
  group h by new { DataTypeID = h.DataTypeID, Name = h.Name } into g
  select new
 {
   DataTypeID = g.Key.DataTypeID,
   Name = g.Key.Name,
   DataValues = (string)g.Aggregate("", (a, b) => (a != "" ? "," : "") + b.DataValue),
 }).ToList()
Run Code Online (Sandbox Code Playgroud)

问题是LINQ to Entities不知道如何将其转换为SQL.这是3个LINQ查询联合的一部分,我真的希望它保持这种方式.我想我可以检索数据,然后再执行聚合.出于性能原因,这对我的应用程序无效.我还考虑过使用SQL服务器功能.但这在EF4世界中似乎并不"正确".

有人在乎这个问题吗?

c# linq aggregate entity-framework-4

14
推荐指数
3
解决办法
4万
查看次数

将每小时数据聚合到每日聚合中

我有以下格式的每小时天气数据:

Date,DBT
01/01/2000 01:00,30
01/01/2000 02:00,31
01/01/2000 03:00,33
...
...
12/31/2000 23:00,25
Run Code Online (Sandbox Code Playgroud)

我需要的是每日聚合最大值,最小值,如此:

Date,MaxDBT,MinDBT,AveDBT
01/01/2000,36,23,28
01/02/2000,34,22,29
01/03/2000,32,25,30
...
...
12/31/2000,35,9,20
Run Code Online (Sandbox Code Playgroud)

在R中如何做到这一点?

time datetime aggregate r

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

DDD,实体框架,聚合实体行为(Person.AddEmail等)

这是一个我正在遇到的问题的一个简单例子,它没有与这里提出的一些想法和其他有关DDD的地方相关联.

假设我有一个ASP.NET MVC 3站点,可以创建/操作一个人.控制器访问应用程序服务层(PersonService),后者又使用域实体(EF 4 POCO)和PersonRepository进行更改并保留它们.为简单起见,我在这里省略了所有接口.在这种情况下,Person是根,为简单起见,只有电子邮件地址(也假设电子邮件不是不可变的,可以更新).

选项1:尽量坚持[我的理解] DDD的基础知识,其中与实体直接相关的行为是作为实体的一部分实现的(Person实现AddEmail,ChangeEmail等).除了Add*方法之外,唯一的问题是Person需要知道上下文或实体框架部分(这将消除任何持久性无知)或需要使用"服务"或存储库来标记修改后的电子邮件.

// Person Service
public class PersonService {
    // constructor injection to get unit of work and person repository...
    // ...methods to add/update a person
    public EmailAddress AddEmailAddress(int personId, EmailAddress email)
    {   
        Person p = personRepository.Find(p => p.Id == personId).First();
        p.AddEmail(email);   
        uow.SaveChanges();
        return email; 
    }

    public EmailAddress ChangeEmailAddress(EmailAddress email)
    {
        Person p = personRepository.Find(p => p.Id == personId).First();
        p.ChangeEmail(email);   
        // change state of email object here so it's updated in the next line??? …
Run Code Online (Sandbox Code Playgroud)

entity domain-driven-design entity-framework aggregate anemic-domain-model

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

单个tapply或聚合语句中的多个函数

是否可以在单个tapply或aggregate语句中包含两个函数?

下面我使用两个tapply语句和两个聚合语句:一个用于均值,一个用于SD.
我更愿意结合这些陈述.

my.Data = read.table(text = "
  animal    age     sex  weight
       1  adult  female     100
       2  young    male      75
       3  adult    male      90
       4  adult  female      95
       5  young  female      80
", sep = "", header = TRUE)

with(my.Data, tapply(weight, list(age, sex), function(x) {mean(x)}))
with(my.Data, tapply(weight, list(age, sex), function(x) {sd(x)  }))

with(my.Data, aggregate(weight ~ age + sex, FUN = mean)
with(my.Data, aggregate(weight ~ age + sex, FUN =   sd)

# this does not work:

with(my.Data, tapply(weight, list(age, sex), function(x) …
Run Code Online (Sandbox Code Playgroud)

aggregate r tapply

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

T-SQL GROUP BY:包含其他分组列的最佳方法

我是一个试图将一些东西移植到MS SQL Server的MySQL用户.

我正在加入几个表,并通过GROUP BY聚合一些列.

一个简单的例子是员工和项目:

select empID, fname, lname, title, dept, count(projectID)
from employees E left join projects P on E.empID = P.projLeader
group by empID
Run Code Online (Sandbox Code Playgroud)

...这可以在MySQL中运行,但MS SQL更严格,并且要求所有内容都包含在聚合函数中或者是GROUP BY子句的一部分.

所以,当然,在这个简单的例子中,我假设我可以在group by子句中包含额外的列.但我正在处理的实际查询非常复杂,并且包括在一些非聚合列上执行的一系列操作...即,尝试将所有这些操作包含在group by子句中会非常难看.

那么有更好的方法吗?

t-sql sql-server group-by aggregate

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

COUNT SQL函数的性能

使用该COUNT函数编写SQL语句时,我有两个选择.

  1. SELECT COUNT(*) FROM <table_name>
  2. SELECT COUNT(some_column_name) FROM <table_name>

在性能方面,什么是最好的SQL语句?使用选项1可以获得一些性能提升吗?

sql sql-server performance aggregate sql-server-2005

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

聚合data.table中的多个列

我有以下样本data.table:

dtb <- data.table(a=sample(1:100,100), b=sample(1:100,100), id=rep(1:10,10))
Run Code Online (Sandbox Code Playgroud)

例如,我想通过id聚合所有列(a和b,尽管它们应该保持分开)colSums.这样做的正确方法是什么?以下不起作用:

 dtb[,colSums, by="id"]
Run Code Online (Sandbox Code Playgroud)

这只是一个示例,我的表有很多列,所以我想避免在函数名中指定所有列

aggregate r dataframe data.table

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

按名称添加两个向量

我有两个命名的向量

v1 <- 1:4
v2 <- 3:5
names(v1) <- c("a", "b", "c", "d")
names(v2) <- c("c", "e", "d")
Run Code Online (Sandbox Code Playgroud)

我想通过名称添加它们,即预期的结果是

> v3  
a b c d e   
1 2 6 9 4
Run Code Online (Sandbox Code Playgroud)

有没有办法以编程方式在R中执行此操作?请注意,名称可能不一定按排序顺序排列,v2如上所述.

aggregate r vector names addition

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