我们有以下数据
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 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代码可能不正确的不同情况.但是,有一点令我感到惊讶.他们声称
通过使用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) 让我们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 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) 我试图创建一个向量工厂,该工厂创建一个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)
我究竟做错了什么?
我想在这里挑战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 ×6
sql-server ×6
c++ ×1
clang ×1
datetime ×1
estimation ×1
group-by ×1
isnull ×1
select ×1