我有一张表如下:
CallID | CompanyID | OutcomeID
----------------------------------
1234 | 3344 | 36
1235 | 3344 | 36
1236 | 3344 | 36
1237 | 3344 | 37
1238 | 3344 | 39
1239 | 6677 | 37
1240 | 6677 | 37
Run Code Online (Sandbox Code Playgroud)
我想创建一个SQL脚本来计算Sales结果的数量和所有其他尝试的数量(任何<> 36),类似于:
CompanyID | SalesCount | NonSalesCount
------------------------------------------
3344 | 3 | 1
6677 | 0 | 2
Run Code Online (Sandbox Code Playgroud)
有没有办法做COUNT()包含像COUNT这样的条件(CallID WHERE OutcomeID = 36)?
我需要在列上计算不同的值,例如:
Hours
1
1
2
null
null
null
Run Code Online (Sandbox Code Playgroud)
结果必须是:3.我的查询是:
select count(distinct hour) from hours;
Run Code Online (Sandbox Code Playgroud)
但它返回:2.我也测试过:
select count(*) from hours group by hour
Run Code Online (Sandbox Code Playgroud)
但它返回三行:
(1) 3
(2) 2
(3) 1
Run Code Online (Sandbox Code Playgroud)
如何将空值计算为1值并使用distinct来避免计算重复值?
我正在学习高级SQL,他们想要我对所有解决方案的这些要求:
尝试最小化解决查询所需的子查询数.此外,您不能使用以下结构:
- FROM或SELECT中的SELECT.您可以拥有子查询(在WHERE或HAVING中选择SELECT)
- 聚合函数的组合,例如COUNT(COUNT ...)),SUM(COUNT ...))等.
- UNION,如果你能避免它.
- 非标准功能(如NVL)
- 案件
可能重复:
计数(*)与计数(1)
我记得有传闻说:
当count(1)执行时,永远不要使用count(*)
最近我把这个建议传递给了另一位开发人员,并且被要求证明这是真的.当我得到建议时,我的论点就是我被告知的情况:数据库只返回第一列,然后计算.反驳的是,数据库不会评估括号中的任何内容.
从小桌子上的一些(不科学的)测试来看,似乎没有区别.我目前无权访问任何大型表格进行试验.
当我使用Sybase时,我得到了这个建议,表有数亿行.我现在正在使用Oracle并且数据少得多.
所以我想总结一下,我的两个问题是:
是否可以将外键分配给PostgreSQL中的json属性?这是我想要实现的一个例子,但它不起作用:
CREATE TABLE Users (Id int NOT NULL PRIMARY KEY);
CREATE TABLE Data (
Id int NOT NULL PRIMARY KEY,
JsonData json NOT NULL, -- [{Id: 1, somedata: null},{Id: 2, somedata: null}, ...]
CONSTRAINT FK_Users_Data FOREIGN KEY (JsonData->Id) REFERENCES Users(Id) -- this constraint will fail
);
Run Code Online (Sandbox Code Playgroud) 使用该COUNT函数编写SQL语句时,我有两个选择.
SELECT COUNT(*) FROM <table_name>SELECT COUNT(some_column_name) FROM <table_name>在性能方面,什么是最好的SQL语句?使用选项1可以获得一些性能提升吗?
我在MSSQL2008中运行这样的查询:
select count(*)
from t1
inner join t2 on t1.id = t2.t1_id
inner join t3 on t1.id = t3.t1_id
Run Code Online (Sandbox Code Playgroud)
假设t1.id有一个NOT NULL约束.因为它们是内连接并且t1.id永远不能为null,所以使用count(t1.id)而不是count(*)应该产生完全相同的最终结果.我的问题是:性能是否相同?
我也想知道联接是否会影响这个.我意识到添加或删除连接会影响性能和结果集的长度.假设在不更改连接模式的情况下,您设置count为仅定位一个表.会有什么不同吗?换句话说,这两个查询之间是否存在差异:
select count(*) from t1 inner join t2 on t1.id = t2.t1_id
select count(t1.*) from t1 inner join t2 on t1.id = t2.t1_id
Run Code Online (Sandbox Code Playgroud)
MySQL中的COUNT(id)与COUNT(*)为MySQL回答了这个问题,但是我找不到具体的MS-SQL答案,而且我找不到任何考虑join因素的东西.
注意:我试图在Google和SO上找到这些信息,但很难弄清楚如何说出我的搜索.
我正在使用Hibernate来检索特定查询的行数.假设我有一个名为'Person'的表,其中包含各种列.其中一列是'name'.
如果我想获得名为"安德鲁"的人数,哪种方式最有效?假设它们中的一些/全部存在性能差异.有没有更好的方法来使用Hibernate/SQL?
(1)选择所有列
Query query = session.createQuery("from Person where name= :name");
query.setParameter("name", name);
List result = query.list();
int count = result.size();
Run Code Online (Sandbox Code Playgroud)
(2)只选择名称列
Query query = session.createQuery("select name from Person where name= :name");
query.setParameter("name", name);
List result = query.list();
int count = result.size();
Run Code Online (Sandbox Code Playgroud)
(3)在查询中使用Count
Query query = session.createQuery("select count(*) from Person where name= :name");
query.setParameter("name", name);
long count = (Long) query.uniqueResult();
Run Code Online (Sandbox Code Playgroud)
(4)在查询中使用Count和name列
Query query = session.createQuery("select count(name) from Person where name= :name");
query.setParameter("name", name);
long count = (Long) query.uniqueResult();
Run Code Online (Sandbox Code Playgroud)
编辑:对不起,我的列表中有两个3号
评论"如何减少简单选择查询的响应时间?" 告诉:
"LaunchDate上的数据类型是什么?如果DATETIME或DATETIME2是DATETIME或DATETIME2,则索引不太可能做多,因为它们包含时间部分 - OMG Ponies"
"@OMG - 为什么DateTime列上的Clustered Index不能提高性能?查询是一个范围扫描,它允许快速索引查找,因为所有数据都在顺序块中?半相关... msdn. microsoft.com/en-us/library/ms177416.aspx - 卡尔加里编码器"
"Calgary Coder:DATETIME/2包括时间 - 一个索引,无论是聚簇的还是非聚集的,对于重复次数而不是范围的日期都是有用的. - OMG Ponies"
我在DATETIME类型列上创建了一个带有聚簇索引的测试表,LaunchDate并观察索引查找类似于上述问题中引用的查询:
SELECT COUNT(primaryKeyColumn)
FROM MarketPlan
WHERE LaunchDate > @date
Run Code Online (Sandbox Code Playgroud)
而不是表或索引扫描.
为什么DateTime列上的聚簇索引不会提高性能?
为什么索引不是可能做得太多,如果它DATETIME或DATETIME2因为它们包括时间部分?
我很欣赏一个脚本,说明DATETIME列的索引不会提高性能.
更新:另外,OMG没有暗示对指数DATE型列将是有益的,但不DATETIME和DATETIME2?
sql-server indexing performance database-design clustered-index
我的查询如下;
SELECT COUNT(Id) FROM Table
Run Code Online (Sandbox Code Playgroud)
该表包含3300万条记录 - 它包含Id上的主键,没有其他索引.
查询需要30秒.
实际执行计划显示它使用聚簇索引扫描.
我们已经分析了该表,发现它没有使用此链接中显示的第一个查询进行分段:http://sqlserverpedia.com/wiki/Index_Maintenance.
关于为什么这个查询如此缓慢以及如何解决它的任何想法.
表定义:
CREATE TABLE [dbo].[DbConversation](
[ConversationID] [int] IDENTITY(1,1) NOT NULL,
[ConversationGroupID] [int] NOT NULL,
[InsideIP] [uniqueidentifier] NOT NULL,
[OutsideIP] [uniqueidentifier] NOT NULL,
[ServerPort] [int] NOT NULL,
[BytesOutbound] [bigint] NOT NULL,
[BytesInbound] [bigint] NOT NULL,
[ServerOutside] [bit] NOT NULL,
[LastFlowTime] [datetime] NOT NULL,
[LastClientPort] [int] NOT NULL,
[Protocol] [tinyint] NOT NULL,
[TypeOfService] [tinyint] NOT NULL,
CONSTRAINT [PK_Conversation_1] PRIMARY KEY CLUSTERED
(
[ConversationID] ASC
)WITH (PAD_INDEX = …Run Code Online (Sandbox Code Playgroud) 我的表是:
|ID |data | cr |
| 1 | AAA | |
| 2 | AAA | |
| 3 | AAA | |
| 4 | BBB | |
| 5 | CCC | |
| 6 | BBB | |
Run Code Online (Sandbox Code Playgroud)
我需要结果:
|ID |data | cr |
| 1 | AAA | 3 |
| 2 | AAA | 3 |
| 3 | AAA | 3 |
| 4 | BBB | 2 |
| 5 | CCC …Run Code Online (Sandbox Code Playgroud) sql ×6
count ×3
performance ×3
sql-server ×3
aggregate ×1
hibernate ×1
indexing ×1
java ×1
join ×1
null ×1
oracle ×1
postgresql ×1