我在从表中显示正确的数据时遇到了麻烦。我不太确定要搜索什么。我不确定min(column)或max(column)在这里对我有帮助。让我们看看我是否可以解释我的问题。
我的表包含以下数据:
> Code (nvarchar) | DateFrom (datetime) | DateTo (datetime)
> =========================================================
> 3006 | 2014-06-18 07:00:00 | 2014-06-18 08:00:00
> 3006 | 2014-06-18 09:00:00 | 2014-06-18 22:00:00
> 1006 | 2014-06-18 07:00:00 | 2014-06-18 09:00:00
> 1006 | 2014-06-18 08:00:00 | 2014-06-18 08:30:00
> 1006 | 2014-06-18 08:10:00 | 2014-06-18 18:00:00
我将以一种观点来介绍这一点。它将按代码分组。
我想要的是此输出:
> Code | DateFrom | DateTo
> =========================================================
> 3006 | 2014-06-08 07:00:00 | 2014-06-18 08:00:00
> 3006 | 2014-06-18 09:00:00 | 2014-06-18 22:00:00
> 1006 | 2014-06-18 07:00:00 | 2014-06-18 18:00:00
如您所见,DateTo和DateFrom之间是否存在间隙,我希望将其显示为两行。但是,如果具有相同代码的下一个“
DateFrom”在DateTo结束之前(或同时)开始,则我希望改为显示“ DateTo”。
在这种情况下,我看不到如何使用功能max()或min()。由于时隙之间可能存在间隙。
你们有什么线索吗?
我正在使用MS SQL 2012
提前致谢!
编辑:评论。岛屿可能是我的祸根?
旧的答案有一个缺点:每行仅与前一行进行检查,以验证时间段是否重叠;如果前一行的时间段持续的时间更长,则逻辑将不考虑它。例如:
Code | DateStart | DateFrom | Overlap
-----+---------------------+---------------------+---------
1006 | 2014-06-18 07:00:00 | 2014-06-18 19:00:00 | 0
1006 | 2014-06-18 08:10:00 | 2014-06-18 10:00:00 | 1
1006 | 2014-06-18 16:00:00 | 2014-06-18 20:30:00 | 0 <- don't overlap with
previous but overlap
with the first
为了改善这种PrevStop
需要变得LastStop
和有以前的最大的价值DateFrom
为Code
With N AS (
SELECT Code, DateFrom, DateTo
, LastStop = MAX(DateTo)
OVER (PARTITION BY Code ORDER BY DateFrom, DateTo
ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING)
FROM Table1
), B AS (
SELECT Code, DateFrom, DateTo
, Block = SUM(CASE WHEN LastStop Is Null Then 1
WHEN LastStop < DateFrom Then 1
ELSE 0
END)
OVER (PARTITION BY Code ORDER BY DateFrom, LastStop)
FROM N
)
SELECT Code
, MIN(DateFrom) DateFrom
, MAX(DateTo) DateTo
FROM B
GROUP BY Code, Block
ORDER BY Code, Block
[SQLFiddle Demo](http://www.sqlfiddle.com/#!6/a5c59/22)
ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING
需要从中删除当前行MAX
。
旧答案
此查询仅在不完全在先例中的每个期间才有效。
这个想法是检查每一行是否与下一个/上一个链接。
如果行被链接,则它们形成一个块,它们将被分组在一起以得到第一个DateFrom
和最后一个DateTo
With N AS (
SELECT Code, DateFrom, DateTo
, PrevStop = LAG(DateTo, 1, NULL)
OVER (PARTITION BY Code ORDER BY DateFrom)
FROM Table1
), B AS (
SELECT Code, DateFrom, DateTo
, Block = SUM(CASE WHEN PrevStop Is Null Then 1
WHEN PrevStop < DateFrom Then 1
ELSE 0
END)
OVER (PARTITION BY Code ORDER BY PrevStop)
FROM N
)
SELECT Code
, MIN(DateFrom) DateFrom
, MAX(DateTo) DateTo
FROM B
GROUP BY Code, Block
ORDER BY Code, Block
[SQLFiddle demo](http://www.sqlfiddle.com/#!6/e57dc/9)
在同一代码/天上添加了一些数据以检查更多块
该查询搜索块启动器,检查每行是代码的第一行(PrevStop IS NULL
)还是在前一行(PrevStop < DateFrom
)之外。
窗口SUM
仅检索的前一行,ORDER
以为链接的数据块创建成本值,例如,使用测试数据,我们将获得
Code | DateStart | DateFrom | Starter | Block
-----+---------------------+---------------------+---------+------
1006 | 2014-06-18 07:00:00 | 2014-06-18 09:00:00 | 1 | 1
1006 | 2014-06-18 08:10:00 | 2014-06-18 06:00:00 | 0 | 1
1006 | 2014-06-18 08:00:00 | 2014-06-18 08:30:00 | 0 | 1
1006 | 2014-06-18 07:00:00 | 2014-06-18 07:30:00 | 1 | 2
1006 | 2014-06-18 08:00:00 | 2014-06-18 08:30:00 | 1 | 3
1006 | 2014-06-18 08:10:00 | 2014-06-18 09:00:00 | 0 | 3
3006 | 2014-06-18 07:00:00 | 2014-06-18 08:00:00 | 1 | 1
3006 | 2014-06-18 09:00:00 | 2014-06-18 10:00:00 | 1 | 2
分组Code
并Block
得到结果
问题内容: 我想检查日期是否在开始日期和结束日期之间。 我添加了一个where子句 但问题在于它不包含“ 2010-04-15”。 它应该包括结束日期,我该怎么办? 请帮我 问候, 潘卡 问题答案: 明确指定时间部分:
我试图找出明星日期和结束日期的员工时钟。以下是我所掌握的数据示例。 需要输出: 我必须根据eventtime和activitycode找到此人的开始日期和结束日期。开始日期将是事件时间列,我必须从行中下一个事件时间的同一列计算结束日期。 我曾尝试在T-SQL中使用lead函数,但它并没有给出我想要的结果。 如果有人知道如何处理这个问题,我会非常感激。
问题内容: 好吧,假设我有一个看起来像这样的表: 任何人都有关于如何查询它的想法,因此数据看起来像 问题答案: 我不会将ID放在这里,因为我认为它与查询无关。如果您愿意,请稍后再说。这是一个MSSQL查询。 可以很容易地将其翻译为其他数据库类型。
问题内容: 我一直在尝试从时间戳字段中的第一个日期到最后一个日期生成一系列日期(YYYY-MM-DD HH)。我已经有了所需的内容,但是在尝试从表中获取开始日期和结束日期时遇到了一个问题。我有以下一个大概的想法: Postgres 9.3 问题答案: 您不需要CTE,这将比必要的成本更高。 而且您不需要强制转换为,当您向类型提供数据时,结果已经 是 数据类型。详细信息在这里: 在PostgreSQ
如何先按开始日期在fullCalendar中排序事件? 示例: 首先开始的事件将显示在顶部,随后开始的事件将显示在后面 如果两个事件的开始日期相同,则按结束日期对它们进行排序,即先显示一个较早结束的事件,然后显示一个较晚结束的事件。 日历显示事件顺序
问题内容: 我在表中有此数据 每当FIELD_D中的值更改时,它就会组成一个组,而我需要该组中的最小和最大日期。查询应该返回 到目前为止,我看到的示例在Field_D中的数据是唯一的。这里的数据可以重复显示,首先是“ N”,然后变为“ P”,然后又回到“ N”。 任何帮助将不胜感激 谢谢 问题答案: 如果SQL实现支持分析功能,则可以使用LAG,LEAD和COUNT()OVER这样的解析函数,以发