小编Rad*_*ača的帖子

条件聚合性能

我们有以下数据

 IF OBJECT_ID('dbo.LogTable', 'U') IS NOT NULL  DROP TABLE dbo.LogTable

 SELECT TOP 100000 DATEADD(day, ( ABS(CHECKSUM(NEWID())) % 65530 ), 0) datesent 
 INTO [LogTable]
 FROM    sys.sysobjects
 CROSS JOIN sys.all_columns
Run Code Online (Sandbox Code Playgroud)

我想计算行数,去年行数和最近十年行数.这可以使用条件聚合查询或使用子查询来实现,如下所示

-- conditional aggregation query
SELECT
    COUNT(*) AS all_cnt,
    SUM(CASE WHEN datesent > DATEADD(year,-1,GETDATE())
             THEN 1 ELSE 0 END) AS last_year_cnt,
    SUM(CASE WHEN datesent > DATEADD(year,-10,GETDATE())
             THEN 1 ELSE 0 END) AS last_ten_year_cnt
FROM LogTable


-- subqueries
SELECT
(
    SELECT count(*) FROM LogTable 
) all_cnt, 
(
    SELECT count(*) FROM LogTable WHERE datesent …
Run Code Online (Sandbox Code Playgroud)

sql sql-server query-performance conditional-aggregation

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

为什么查询优化器选择完全不同的查询计划?

让我们在SQL Server 2016中有下表

-- generating 1M test table with four attributes
WITH x AS 
(
  SELECT n FROM (VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) v(n)
), t1 AS
(
  SELECT ones.n + 10 * tens.n + 100 * hundreds.n + 1000 * thousands.n + 10000 * tenthousands.n + 100000 * hundredthousands.n as id  
  FROM x ones,     x tens,      x hundreds,       x thousands,       x tenthousands,       x hundredthousands
)
SELECT  id,
        id % 50 predicate_col,
        row_number() over (partition by id % 50 order by id) join_col, …
Run Code Online (Sandbox Code Playgroud)

sql sql-server query-optimization

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

条件没有ISNULL臭吗?

我遇到一篇文章描述了SQL代码可能不正确的不同情况.但是,有一点令我感到惊讶.他们声称

通过使用COALESCE提供默认值,明智地处理可空列中的NULL是明智的

ISNULL也被提到了.他们还参考了这个MSDN网页,给出了一个例子ISNULL.这里的基本思想是使用它更好

SELECT COUNT(*) FROM [dbo].[Table1] WHERE ISNULL([c2],0) > 2;
Run Code Online (Sandbox Code Playgroud)

然后

SELECT COUNT(*) FROM [dbo].[Table1] WHERE [c2] > 2;
Run Code Online (Sandbox Code Playgroud)

但是,第一个变体不是SARG,而结果不受任何影响ISNULL.我理解需要处理NULL使用ISNULL或COALESCE输出,但是,我总是尝试使用IS NULL或IS NOT NULL处理NULL谓词.我错过了什么吗?MSDN问题有什么意义?

编辑:为了对讨论做出反应,主要是在这篇文章中,我准备了一个简单的测试

 IF OBJECT_ID('dbo.LogTable', 'U') IS NOT NULL  DROP TABLE dbo.LogTable

 SELECT TOP 100000 DATEADD(day, ( ABS(CHECKSUM(NEWID())) % 65530 ), 0) datesent ,
      CASE WHEN ( ABS(CHECKSUM(NEWID())) % 100 ) = 1 THEN …
Run Code Online (Sandbox Code Playgroud)

sql sql-server select isnull

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

简单查询的选择性估计误差

让我们tt像这样创建一个简单的表

WITH x AS (SELECT n FROM (VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) v(n)), t1 AS
(
  SELECT ones.n + 10 * tens.n + 100 * hundreds.n + 1000 * thousands.n + 10000 * tenthousands.n as id  
  FROM x ones,     x tens,      x hundreds,       x thousands,       x tenthousands,       x hundredthousands
)
SELECT  id,
        id % 100 groupby,
        row_number() over (partition by id % 100 order by id) orderby,
        row_number() over (partition by id % 100 order by id) / (id % 100 …
Run Code Online (Sandbox Code Playgroud)

sql sql-server estimation sql-server-2016

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

SQL Server组按日期和时间

使用SQL Server,我有一个表,CreatedAt其中包含一个具有datetime数据类型的列.我正在尝试编写一个查询,该查询将返回每个日期的总记录,但也会将日期分为一天中的时间,即上午,下午和晚上.因此,例如,下表

ID     createdAt
------------------------------
1      2017-10-17 21:31:52.160
2      2017-10-17 12:12:12.160
3      2017-10-17 09:09:09.160
4      2017-10-17 21:31:52.160
5      2017-10-16 21:31:52.160
Run Code Online (Sandbox Code Playgroud)

会返回以下结果

DayCounter    SessionDay    Morning    Afternoon    Evening
4             2017-10-17    1          1            2
1             2017-10-16    0          0            1
Run Code Online (Sandbox Code Playgroud)

我有以下两个查询按天分组数据,然后拆分从日期中提取时间,但我无法弄清楚如何将它们放在一起.

SELECT 
    COUNT(createdAt) AS counter, 
    CONVERT(DATE, createdAt) AS sessionDay
FROM 
    MyTable
GROUP BY 
    CONVERT(DATE, createdAt)
Run Code Online (Sandbox Code Playgroud)

和

SELECT 
    CASE 
       WHEN CAST(CONVERT(CHAR(2), createdAt, 108) AS INT) < 12 
          THEN 'Morning'
       WHEN CAST(CONVERT(CHAR(2), createdAt, 108) AS INT) < 17 
          THEN 'Afternoon'
       ELSE 'Evening' …
Run Code Online (Sandbox Code Playgroud)

sql sql-server datetime group-by

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

具有初始化的Vector &lt;int&gt;工厂不起作用

我试图创建一个向量工厂,该工厂创建一个1具有指定大小的值的向量,s但无法按预期工作。

template<size_t s>
constexpr std::vector<int>& vector_factory()
{
    std::vector<int> v(s, 1);
    return v;
}


int main(int argc, char* argv[])
{
    constexpr size_t s = 10;
    std::vector<int> v1 = vector_factory<s>();
    std::vector<int> v2 = vector_factory<s>();
}
Run Code Online (Sandbox Code Playgroud)

由于分配尝试过多,导致出现运行时错误。但是,如果我尝试以这种方式实现它,则它可以正常工作。

constexpr size_t s = 10;
std::vector<int> v1(s, 1);
std::vector<int> v2(s, 1);
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

c++ clang visual-studio

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

SQL挑战:为什么SQL查询不按NULL分组

我想在这里挑战SQL社区.让我们拥有以下数据和SQL查询:

create table A
(
    a_id integer unique,
    code int
);

create table B
(
    a_id integer foreign key references A(a_id),
    b_count int
);

insert into A values (1, 20);
insert into A values (3, 30);
insert into A values (null, 30);

insert into B values (1, 100);
insert into B values (1, 120);
insert into B values (null, 200);

select A.a_id, sum(B.b_count) Bsum
from A
left join B on A.a_id = B.a_id
group by A.a_id
Run Code Online (Sandbox Code Playgroud)

为什么SQL查询没有将NULL的值相加?换句话说,为什么我们得到

a_id    Bsum
--------------- …
Run Code Online (Sandbox Code Playgroud)

sql sql-server

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