当前位置: 首页 > 面试题库 >

SQL Server,查找任意值序列

赵智
2023-03-14
问题内容

假设我们有一张表Maintenance

Customer LastLogin ActionType
1        12/1/2007 2
1        12/2/2007 2
etc.

我们想要一个在给定年份中的任何时间点上具有一个或多个不间断序列(长14天)且操作类型为2的登录的所有客户的列表。

我当然可以轻松地用代码来做到这一点,甚至可以在小型代码集上相当快地做到这一点。在SQL中有非游标方法吗?


问题答案:

这将选择具有至少两个连续的相同类型操作的所有客户。

WITH    rows AS 
        (
        SELECT  customer, action,
                ROW_NUMBER() OVER (PARTITION BY customer ORDER BY lastlogin) AS rn
        FROM    mytable
        )
SELECT  DISTINCT customer
FROM    rows rp
WHERE   EXISTS
        (
        SELECT  NULL
        FROM    rows rl
        WHERE   rl.customer = rp.customer
                AND rl.rn = rp.rn + 1
                AND rl.action = rp.action
        )

这是正义行动的更有效查询2

WITH    rows AS 
        (
        SELECT  customer, ROW_NUMBER() OVER (PARTITION BY customer ORDER BY lastlogin) AS rn
        FROM    mytable
        WHERE   action = 2
        )
SELECT  DISTINCT customer
FROM    rows rp
WHERE   EXISTS
        (
        SELECT  NULL
        FROM    rows rl
        WHERE   rl.customer = rp.customer
                AND rl.rn = rp.rn + 1
        )

更新2:

要选择不间断范围:

WITH    rows AS 
        (
        SELECT  customer, action, lastlogin
                ROW_NUMBER() OVER (PARTITION BY customer ORDER BY lastlogin) AS rn
                ROW_NUMBER() OVER (PARTITION BY customer, action ORDER BY lastlogin) AS series
        FROM    mytable
        )
SELECT  DISTINCT customer
FROM    (
        SELECT  customer
        FROM    rows rp
        WHERE   action
        GROUP BY
                customer, actioncode, series - rn
        HAVING
                DETEDIFF(day, MIN(lastlogin), MAX(lastlogin)) >= 14
        ) q

此查询计算两个序列:一个返回连续的序列ORDER BY lastlogin,第二个通过action另外划分:

action  logindate rn  series diff = rn - series
1       Jan 01    1   1      0
1       Jan 02    2   2      0
2       Jan 03    3   1      2
2       Jan 04    4   2      2
1       Jan 05    5   3      2
1       Jan 06    6   4      2

只要两种方案之间的差异相同,该系列就不会中断。每次打断都会打断系列。

这意味着(action, diff)的组合定义了不间断的组。

我们可以按分组action, diff,在分组中找到MAXMIN,然后对其进行过滤。

如果您需要选择14行而不是14连续几天,只是过滤的COUNT(*),而不是DATEDIFF



 类似资料:
  • 我是Python的新手 我想在pandas数据帧中找到某个值的索引(比如说),因为这是列的起始位置。(列上方的行数未知,数据不相关,左侧的“列”为空。) 据我所知,isin方法只返回值是否存在的布尔值,而不是其索引。 如何找到该值的索引?

  • 我需要找到给定数组的中位数,并限制只能使用堆。 我知道用于查找中位数的线性选择算法。以下方法(仅基于堆)是否正确? 从给定数组构建一个max-heap() 从堆的叶子( )构建一个max-heap( ) 从堆的内部节点( )构建一个min-heap( ) 如果是奇数返回 否则返回

  • 问题内容: 我有这样的记录: 如何在hstore中按 任何 属性的最大值/最小值对它们进行排序? 结果应如下所示(按最低顺序排列): 我知道,我只能按如下特定属性来排序它们:,但不适用于我的问题。 问题答案: 使用转换为数组并将结果数组从文本转换为整数。然后对数组进行排序,并按排序后的数组的第一个元素对结果进行排序。 http://sqlfiddle.com/#!15/84f31/5

  • 问题内容: 给定一个#,我如何发现可以在哪个表和列中找到它? 我不在乎它是否很快,它只需要工作即可。 问题答案: 这是来自上面链接的Stored Proc-我所做的唯一更改是用temp表替换了一个表变量,因此您不必记住每次都将其删除。

  • 问题内容: 每个“产品”最多可以有10000个“细分”行。这些细分受众群具有一个针对每种产品(1、2、3、4、5,…)从1开始的排序列,以及一个值列,该列可以包含诸如(323.113、5423.231、873.42、422.64、763.1,…)。 我想确定给定细分子集的产品的潜在匹配。例如,如果我按正确的顺序有5个细分值,那么如何在细分表中某处有效地找到所有具有相同顺序的5个细分的所有产品? 问