标签: aggregate-functions

在一个查询中,是否可以计算列中每个不同值的出现次数?

例如,带有一个列字母的表测试,

letter
-------
A
B
A
A
B
A
B
Run Code Online (Sandbox Code Playgroud)

我能想到这种方式

SELECT count(letter) FROM  test WHERE letter = 'A';
SELECT count(letter) FROM  test WHERE letter = 'B';
Run Code Online (Sandbox Code Playgroud)

但是在上面的查询中,我需要2个select语句,我必须指定要计算的值.是否可以在一个查询中执行此操作而不指定任何值?

sql aggregate-functions

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

在SQL视图中运行总计

我试图在SQL Server 2008的View中运行总计

这是我的桌子

BankAccounts
------------
AccountID (KEY)
Name
Created

Transactions
------------
TransactionID (KEY)
Description
Credit
Debit
TransDate
Created
AccountID

这是我到目前为止的查询..

SELECT t.Created, t.Description, t.Credit, t.Debit, t.TransDate, t.TransactionID, ba.AccountID,
        (isnull(t.Credit,0)-isnull(t.Debit,0))+COALESCE((SELECT SUM(isnull(Credit,0)) - SUM(isnull(Debit,0))
                              FROM Transactions b 
                              WHERE b.TransDate < t.TransDate
                               and b.AccountID = t.AccountID),0)
                                 AS RunningTotal
FROM  Transactions t 
INNER JOIN dbo.BankAccounts ba ON t.AccountID = ba.AccountID

我得到的是......

TransDate               Credit                 Debit                  RunningTotal
----------------------- ---------------------- ---------------------- ---------------------
2011-10-08 20:14:00     NULL                   12                     49.25
2011-10-08 20:14:00     2.11                   NULL                   63.36
2011-10-07 20:14:00     42.25                  NULL …

sql sql-server aggregate-functions totals sql-server-2008

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

SQL MAX日期与WHERE IN子句

我将举两个例子,第一个有效,第二个有我想做的事:

SELECT P.ProjName, D.update_date, SUM(E.pass), SUM(E.fail)
  FROM execution AS E INNER JOIN ( 
    daily AS D INNER JOIN project AS P ON D.project_ID = P.ID )
    ON E.daily_ID = D.ID
  WHERE D.project_id = 25 AND D.update_date = ( 
    SELECT MAX(update_date) FROM daily WHERE project_id = 25; )
  GROUP BY P.ProjName, D.update_date;
Run Code Online (Sandbox Code Playgroud)

这适用于个别项目.它给出了给定项目最近一天的通过和失败总数(此处为25).我想使用WHERE IN子句获取一组项目.例如(但不起作用):

SELECT P.ProjName, D.update_date, SUM(E.pass), SUM(E.fail)
  FROM execution AS E INNER JOIN ( 
    daily AS D INNER JOIN project AS P ON D.project_ID = P.ID )
    ON E.daily_ID …
Run Code Online (Sandbox Code Playgroud)

sql aggregate-functions

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

多个联接表上的聚合函数

我有三张桌子:

CREATE TABLE foo (
    id bigint PRIMARY KEY,
    name text NOT NULL
);

CREATE TABLE foo_bar (
    id bigint PRIMARY KEY,
    foo_id bigint NOT NULL
);

CREATE TABLE tag (
    name text NOT NULL,
    target_id bigint NOT NULL,
    PRIMARY KEY (name, target_id)
);
Run Code Online (Sandbox Code Playgroud)

我试图创建一个视图,使得我得到的所有表的字段foo,项目的数量foo_bar,其中foo.id = foo_bar.foo_id,所有的标签,其中的文字阵列foo.id = tag.target_id.如果我们有:

INSERT INTO foo VALUES (1, 'one');
INSERT INTO foo VALUES (2, 'two');
INSERT INTO foo_bar VALUES (1, 1);
INSERT INTO foo_bar VALUES (2, …
Run Code Online (Sandbox Code Playgroud)

sql postgresql aggregate-functions left-join cross-join

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

对时间序列数据进行重新采样

我有一个毫秒级的时间序列列表,我想重新采样时间序列并在组上应用均值.我怎样才能在Postgres中实现它?

"重新采样"是指在一秒或一分钟内聚合所有时间戳.一秒或一分钟内的所有行组成一个组.

表结构

date    x    y    z
Run Code Online (Sandbox Code Playgroud)

sql postgresql time-series aggregate-functions

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

带有条件条件语句的总和在SQL中如何工作

前几天,我给了这个问题一个答案,但随后其他用户使用sum + case条件语句解决了该问题,并在结果中添加了一个边缘条件。所以,我想到了一个问题,sum(case when jobname = 'Analyst' then 1 else 0 end)以下查询中的语句如何工作

select d.*
from (select deptno,
         sum(case when jobname = 'Analyst' then 1 else 0 end) as numAnalysts
      from employees
      group by deptno
      order by numAnalysts asc
     ) d
where rownum = 1;`
Run Code Online (Sandbox Code Playgroud)

并返回部门中的员工人数。另外,我想了解此查询的性能。

在发布此问题之前,我阅读了thisthisthis,但仍然不知道其工作原理。

oracle conditional aggregate-functions

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

在PL / pgSQL中动态执行查询

我已经找到了我要在Oracle和SQL Server上解决的问题的解决方案(我认为),但是似乎无法将其转换为Postgres解决方案。我正在使用Postgres 9.3.6。

这个想法是为了生成用于分析目的的有关表内容的“元数据”。这只能通过让每一列都运行查询来找出(例如...)最小/最大/计数值等来完成(AFAIK)。为了使过程自动化,最好让数据库生成查询,然后执行查询。

使用示例salesdata表,我可以使用以下代码段为每列生成一个选择查询,并返回min()值:

SELECT 'SELECT min('||column_name||') as minval_'||column_name||' from salesdata '  
FROM information_schema.columns 
WHERE table_name = 'salesdata'
Run Code Online (Sandbox Code Playgroud)

优点是,无论列数如何,数据库都会生成代码。现在,我想到了无数个地方来存储这些查询,这些查询可以是某种变量,也可以是表列,其想法是执行这些查询。我想将生成的查询存储在变量中,然后使用EXECUTE(或EXECUTE IMMEDIATE)语句执行它们,这是此处采用的方法(请参见右窗格),但是Postgres不会让我在函数外部声明变量,因此我一直在抓挠我对如何将它们组合在一起,无论是什至是遵循的方向,也许还有更简单的东西。

您有任何指点吗,由于其他问题,我目前正在尝试类似的方法,但不知道我是否朝着正确的方向前进:

CREATE OR REPLACE FUNCTION foo()
RETURNS void AS
$$
DECLARE
    dyn_sql text; 
BEGIN            
dyn_sql := SELECT 'SELECT min('||column_name||') from salesdata'    
    FROM information_schema.columns 
    WHERE table_name = 'salesdata';
execute dyn_sql
END
$$ LANGUAGE PLPGSQL;    
Run Code Online (Sandbox Code Playgroud)

postgresql dynamic-sql plpgsql aggregate-functions dynamic-queries

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

dplyr:根据聚合函数结果过滤行

我有一个表格列表(金额,年和月),我想过滤与完整年份相对应的行.即我想省略下面给出的示例数据帧的最后4行,参考2015,并获得其余的60.是否可以使用单个dplyr命令执行此操作?

我试过这个:

df %>%
    group_by(year) %>%
    tally() %>%
    filter (n==12) %>%
    ungroup() 
Run Code Online (Sandbox Code Playgroud)

但我想ungroup会做出与我想要的不同的事情.是否可以使用单个dplyr命令执行此操作?

df <- structure(list(amount = c(16365, 31850, 32230, 34177.75, 27900, 
29650, 28846, 27300, 37115.31, 34130.38, 39676.1, 47244.44, 3500, 
25425.48, 22628.43, 30822.86, 30100, 41567.13, 25400, 23125, 
40073.75, 16505.82, 17770, 38406.03, 1528.25, 23475.77, 29869.69, 
17020, 19270, 13085.47, 10607.48, 7800, 15220, 15260, 17580, 
25094.66, 3908.74, 8150, 25055.89, 19690.65, 12445.4, 10347.39, 
7645.39, 49300, 8690, 13660, 16510, 34457.08, 522.68, 10202, 
18900, 25027.1, 24956.42, 23259, 32743, 37226, 32697, 32258, 
31336.67, 36135.81, 4389.26, 12450, 46220.43, …
Run Code Online (Sandbox Code Playgroud)

r filter aggregate-functions dplyr

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

MAX函数与GROUP BY子句一起使用

我有名字,工资和员工部门的数据库.我需要一个查询来获得每个部门薪水最高的员工.

数据库:

create table test(
    employee_name VARCHAR(255),
    department VARCHAR(255),
    salary INT  
);
Run Code Online (Sandbox Code Playgroud)

数据:

INSERT INTO test(employee_name, department, salary) VALUES 
("John", "DepartmentA", 1500),
("Sarah","DepartmentA", 1600),
("Romel","DepartmentA", 1400),
("Victoria","DepartmentB", 1400),
("Maria",   "DepartmentB", 1600);
Run Code Online (Sandbox Code Playgroud)

我的尝试:

1.1 WHERE MAX(薪水)=工资GROUP BY部门

SELECT employee_name, salary FROM test WHERE MAX(salary) = salary GROUP BY department;
ERROR 1111 (HY000): Invalid use of group function
Run Code Online (Sandbox Code Playgroud)

1.2.当我用硬编码值替换MAX(薪水)时,它按预期工作:

SELECT employee_name, salary FROM test WHERE 1600 = salary GROUP BY department;
+---------------+--------+
| employee_name | salary |
+---------------+--------+
| Sarah         |   1600 …
Run Code Online (Sandbox Code Playgroud)

mysql sql select group-by aggregate-functions

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

MySQL查询字段的最短和最长

问题

我需要从数据库返回最短和最长的城市名称及其各自的长度.我也欢迎对此查询进行改进,以使其更加优雅.

SQL小提琴

到目前为止,我有一个示例数据库和查询:http: //sqlfiddle.com/#!9/3b4a7c/1/0

询问

SELECT DISTINCT City, LENGTH(City) as len
FROM STATION
WHERE LENGTH(City)=(SELECT MIN(LENGTH(City)) FROM STATION) 
OR LENGTH(City)=(SELECT MAX(LENGTH(City)) FROM STATION)
ORDER BY len
Run Code Online (Sandbox Code Playgroud)

目前的结果

Dole    4
Reus    4
Sant'Egidio del Monte Albino    28
Run Code Online (Sandbox Code Playgroud)

期望的结果

Dole    4
Sant'Egidio del Monte Albino    28
Run Code Online (Sandbox Code Playgroud)

mysql aggregate-functions

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