相关疑难解决方法(0)

计算总访问量

我正在尝试编写一个查询,我必须通过处理重叠天数来计算客户的访问次数。假设 itemID 2009 的开始日期是 23 日,结束日期是 26 日,因此项目 20010 介于这些天之间,我们不会将此购买日期添加到我们的总数中。

示例场景:

Item ID Start Date   End Date   Number of days     Number of days Candidate for visit count
20009   2015-01-23  2015-01-26     4                      4
20010   2015-01-24  2015-01-24     1                      0
20011   2015-01-23  2015-01-26     4                      0
20012   2015-01-23  2015-01-27     5                      1
20013   2015-01-23  2015-01-27     5                      0
20014   2015-01-29  2015-01-30     2                      2
Run Code Online (Sandbox Code Playgroud)

OutPut 应该是 7 VisitDays

输入表:

CREATE TABLE #Items    
(
CustID INT,
ItemID INT,
StartDate DATETIME,
EndDate DATETIME
)           


INSERT INTO #Items
SELECT 11205, …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2008-r2 gaps-and-islands

12
推荐指数
3
解决办法
1839
查看次数

在哪里可以找到 MySQL、SQL Server 和 Oracle 的示例数据库?

我想试验 3 个大型数据库管理系统。为此目的,为每个数据库使用相同的数据库(相同的表等)会很酷。

在哪里可以找到为 MySQL、MSSQL 和 Oracle 创建相同测试数据库的 sql 脚本?

mysql oracle sql-server feature-comparison

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

根据列值返回行数

我们正在为客户管理抽奖活动,其中我们有一个与参赛者和参赛者获得的参赛作品数量相关联的 GUID。我希望能够根据与参赛人数相对应的获胜机会来抽取获胜者。

GUID | Entries
--------------
1    | 1
2    | 5
3    | 2
4    | 7
Run Code Online (Sandbox Code Playgroud)

所以结果将是:

GUID
----
1
2
2
2
2
2
3
3
4
4
4
4
4
4
4
Run Code Online (Sandbox Code Playgroud)

基本上我计划将结果放在电子表格中,然后使用随机数生成器在 1 和 n 之间选择一个行号,其中 n 是条目的总数。但是,当然,如果有一种方法可以轻松地以编程方式选择获胜者,我会全神贯注(或视情况而定)。

提前致谢。

stored-procedures functions

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

MS SQL Server 是否有generate_series 函数

MS SQL Server 是否有像Postgresql那样的系列生成函数(又名generate_series)。如果没有,有没有基本的方法来实现该功能?优先考虑时间戳版本

我发现这个问题是一个老问题。也许新版本有更好的解决方案。

sql-server sql-server-2019

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

表类型的术语

我目前不确定现有表类型的正确术语,或者确实不确定我所拥有的示例是否有术语。

我已将我目前对我所知道的类型的理解包含在这个问题中。

问:请提供不同表类型的列表,并附上简短的定义和示例来说明它们。

旁注:上下文是我目前正在尝试将数据库缩减为基本版本(用于测试)。作为此过程的一部分,我希望识别包含要查找的值并且不会更改的表(例如职位和部门名称)与可能被清空的“数据”表,而不会对数据库的其余部分产生不良影响(参见在未定义部门或职位名称的情况下添加工作人员时的参照完整性)。

database-design terminology

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

为什么递归 CTE 估计只有 1 行?

给定两个级联的、独立的(没有真正的表)递归 CTE:

create view NumberSequence_0_100_View
as
with NumberSequence as
(
    select 0 as Number
    union all
    select Number + 1
      from NumberSequence    
     where Number < 100
)
select Number
  from NumberSequence;
go

create view NumberSequence_0_10000_View
as
select top 10001
       v100.Number * 100 + v1.Number as Number
  from Common.NumberSequence_0_100_View v100
 cross join Common.NumberSequence_0_100_View v1
 where v1.Number < 100
   and v100.Number * 100 + v1.Number <= 10000
    -- please resist complaining about "order by in view" for this question
 order by v100.Number …
Run Code Online (Sandbox Code Playgroud)

sql-server cte sql-server-2012 recursive cardinality-estimates

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

t-sql - 组合学

我正在尝试在可变长度字符串中找到所有可能的字符组合。

例如:“--”将有 2^n = 2^2 = 4 种可能性,“x-”、“-x”、“xx”、“--”

我认为基本上我需要循环 c(2,2) + c(2,1) + c(2,0) 其中 c(n,r) = n!/ (r! * (nr)!) 但是我在使用 cte 处理事情时遇到了麻烦。到目前为止,随着您向字符串添加字符,一切都开始崩溃了。

使用数字表 -

declare @s varchar(15)
set @s = '--'

;with subset as (
select cast(stuff(@s,number,1,'x') as varchar(15)) as token,
     cast('.' + cast(number as char(1)) + '.' as varchar(11)) as permutation,
     cast(1 as int) as iteration ,
     number
from numbers where number between 1 and len(@s)
union 
select @s, '.0.', 1, 0
) ,

combination as ( …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql

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

根据 15 分钟的间隔获取计数

我有一个包含通话记录的表:

tbl_calls

cl_Id
cl_StartDate
cl_endDate
Run Code Online (Sandbox Code Playgroud)

我传递两个参数@StartDate@EndDate给我的存储过程。

我的要求是在每 15 分钟的持续时间内获取通话记录的数量。

例如,如果:

@StartDate = '2015-11-16 00:00:00.000', 
@EndDate = '2015-11-16 23:59:00.000'
Run Code Online (Sandbox Code Playgroud)

输出应该是:

Date                        Count
2015-11-16 00:00:00.000      10(Count of startDate between '2015-11-16 00:00:00.000' AND '2015-11-16 00:15:00.000')
2015-11-16 00:15:00.000       7(Count of startDate between '2015-11-16 00:15:00.000' AND '2015-11-16 00:30:00.000')
2015-11-16 00:30:00.000      50(Count of startDate between '2015-11-16 00:30:00.000' AND '2015-11-16 00:45:00.000')

upto @EndDate
Run Code Online (Sandbox Code Playgroud)

我已经尝试了以下查询,但它不能正常工作。有一个更好的方法吗?

DECLARE @StartDate DATETIME = DATEADD(DAY,-1,GETUTCDATE()),
        @EndDate DATETIME = GETUTCDATE()

SELECT New 
FROM
    (SELECT 
         (CASE 
             WHEN cl_StartTime BETWEEN @StartDate AND …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2008-r2 count date

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

不同频率表之间的连接

假设我有两个表DailyTableQuarterlyTable,每个表都有 3 列:IDDateValue

顾名思义,DailyTable存储数据的频率是每天,而QuarterlyTable存储数据的频率是季度。

如何连接这两个表,以便根据IDDate 将每个表中的最新(时间点)数据结合起来获得每日结果?

每日表

    ID   |  Date   |    Value  |
---------+---------+------------
    1    |1/1/2010 |     10    |
    1    |1/2/2010 |     15    |
              ... 
    1    |3/1/2010 |     20    |
              ... 
    1    |4/1/2010 |     30    |
Run Code Online (Sandbox Code Playgroud)

季表

    ID   |  Date   |    Value  |
---------+---------+------------
    1    |1/1/2010 |   1000    |
    1    |4/1/2010 |   2000    |
              ... 
Run Code Online (Sandbox Code Playgroud)

结果

    ID   |  Date   |    Value  | …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 join sql-server greatest-n-per-group

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

验证 HTML 输入字符串

的部分解决方案是让所有的Notes (VARCHAR)地方有一个不平衡<>。但是我怎么能写一个查询呢?

例如:

Input: <html>Hello World</html>
Output: Valid HTML

Input: <html><Hello World</html>
Output: Invalid HTML

Input: <html><Hello World></html>
Output: Valid HTML (Marking it Valid is OK for my use case)
But hey isn't that a valid HTML? It could be <name attribute>
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来检查“无效”HTML,其中“无效”被定义为 HTML 内容,<后面跟着一些HTML Element根据规范无效的字符?

最初我以为我可以检查<name后跟一个(空格),但 HTML 属性的语法为 as<name attribute>在最后关闭。

sql-server

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

如何加速循环 INSERT INTO 语句?

我目前使用以下语句,对于 10,000 行,大约需要 150 秒。我尝试删除目标表上的索引,但这没有帮助。在没有INSERT INTO50ms 的情况下运行循环。我需要它来更新大约 3 亿行,我真的等不及 52 天 (!) 才能完成。

以下更新查询的底线是我需要遍历每一行,对 a 执行计算VARBINARY并从中提取正确的值(我们需要去掉打包的VARBINARY字段),并将其存储在一个新表中。

FETCH NEXT FROM LocCities INTO @LocCity 
WHILE (@@FETCH_STATUS = 0)
BEGIN
    -- several sets, removed calculations for clarity
    SET @LocationId = Calculation1()
    SET @CityId = Calculation2()

    IF(@LocCity <> 0)
    BEGIN
        -- left out an inner loop here on the VARBINARY based on its length
        INSERT INTO LocationCities (LocationId, CityId)
        VALUES (@LocationId, @CityId)
    END
    FETCH NEXT FROM RespCursor INTO …
Run Code Online (Sandbox Code Playgroud)

performance insert hints sql-server-2008-r2

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

展开日期范围

我有下表,其中包含以下数据:

DECLARE @MyActions TABLE (ActionId INT NOT NULL, ActionDate DATETIME NOT NULL)

INSERT INTO @MyActions VALUES (1, '2021-08-01 01:00:00')
INSERT INTO @MyActions VALUES (2, '2021-08-02 02:00:00')
INSERT INTO @MyActions VALUES (3, '2021-08-03 03:00:00')
INSERT INTO @MyActions VALUES (4, '2021-08-04 04:00:00')
Run Code Online (Sandbox Code Playgroud)

如何在不使用慢表值函数的情况下将每个 ActionID 分解为 10 个附加记录(当前 ActionID 的日期前 5 天和日期后 5 天)?

ActionID = 1 应该爆炸到 11 个总记录(没有时间),Action 2 应该爆炸到 11 个总记录(没有时间),依此类推

分解结果集

DECLARE @MyActions TABLE (ActionId INT NOT NULL, ActionDate DATETIME NOT NULL)

INSERT INTO @MyActions VALUES (1, '2021-08-01 01:00:00') …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2014 date-math

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

从双引号括起来的记录中删除一个字符

我有一个表,其中每一行都有如下数据:

0150566115,"HEALTH 401K","IC,ON","ICON HEALTH 401K",,,1,08/21/2014
Run Code Online (Sandbox Code Playgroud)

我想要的是删除,包含在双引号“”之间的每个逗号 ( )。然后用逗号 ( ,)分割字符串的其余部分

我不想检查双引号开始和结束的每个字符设置标志。

我可以实现某种正则表达式吗?

有没有简单的方法?

到目前为止,我所尝试的只是根据逗号 ( ,)拆分字符串,但它也在拆分引号内的值。

这是为了达到目的:如何在完整的表中实现这一点(目前,如果我只有一个双引号块实例,它就可以工作)?

Declare @Query nvarchar(max) 

Set @Query = 'Item1,Item2,"Item,Demo,3",New'

Declare @start int, @len int
SELECT @start = PATINDEX('%"%"%', @Query) + 1

print @start

select @len = CHARINDEX('"', SUBSTRING(@Query, @start, LEN(@Query))) - 1

select 
        SUBSTRING(@Query, 1, @start - 2) +
        REPLACE((SUBSTRING(@Query, @start, @len)), ',', '') +
        SUBSTRING(@Query, @start + @len + 1, LEN(@Query))
Run Code Online (Sandbox Code Playgroud)

这是我用来分割的函数

ALTER FUNCTION [dbo].[fnSplit](
    @sInputList VARCHAR(8000) -- List of …
Run Code Online (Sandbox Code Playgroud)

sql-server regular-expression t-sql string-splitting

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