小编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使用ISNULLCOALESCE输出,但是,我总是尝试使用IS NULLIS 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
查看次数