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

得到所有连续的行相差一定值?

潘慈
2023-03-14
问题内容

我正在努力做到这一点,因为它涉及比较连续的行。我正在尝试将相差一定数值的值进行分组。例如,让我们说我有这个表:

CREATE TABLE #TEMP (A int, B int)

-- Sample table
INSERT INTO #TEMP VALUES 
(3,1), 
(3,2), 
(3,3),
(3,4),
(5,1),
(6,1),
(7,2),
(8,3),
(8,4),
(8,5),
(8,6)

SELECT * FROM #TEMP

DROP TABLE #TEMP

让我们说我必须对所有相差1且具有相同A值的值进行分组。然后,我试图获得如下输出:

A B GroupNo
3 1 1
3 2 1
3 3 1
3 4 1
5 1 2
6 1 3
7 2 4
8 3 5
8 4 5
8 5 5
8 6 5

(3,1) (3,2) (3,3) (3,4)并且(8,3) (8,4) (8,5) (8,6)由于它们的值相差1而被归入同一组。我将首先展示我的尝试:

CREATE TABLE #TEMP (A int, B int)

-- Sample table
INSERT INTO #TEMP VALUES 
(3,1), (3,2), (3,3), (3,4), (5,1), (6,1), (7,2),
(8,3), (8,4), (8,5), (8,6)

-- Assign row numbers and perform a left join
-- so that we can compare consecutive rows
SELECT ROW_NUMBER() OVER (ORDER BY A ASC) ID, * 
INTO #TEMP2
FROM #TEMP

;WITH CTE AS
(
    SELECT X.A XA, X.B XB, Y.A YA, Y.B YB
    FROM #TEMP2 X
    LEFT JOIN #TEMP2 Y
    ON X.ID = Y.ID - 1
    WHERE X.A = Y.A AND
    X.B = Y.B - 1
)
SELECT XA, XB
INTO #GROUPS
FROM CTE
UNION 
SELECT YA, YB
FROM CTE
ORDER BY XA ASC

-- Finally assign group numbers
SELECT X.XA, X.XB, Y.GID
FROM #GROUPS X
INNER JOIN
(SELECT XA, ROW_NUMBER() OVER (ORDER BY XA ASC) GID
    FROM #GROUPS Y
    GROUP BY XA
) Y
ON X.XA = Y.XA

DROP TABLE #TEMP
DROP TABLE #TEMP2
DROP TABLE #GROUPS

我将在一个大表(大约3000万行)上执行此操作,因此我希望有一个更好的方法可以对任意值执行此操作(例如,不仅可以相差1,还可以是2或3,稍后合并到程序中)。关于我的方法是否没有错误以及是否可以改进的任何建议?


问题答案:
declare @Diff int = 1

;with C as
(
  select A, 
         B,
         row_number() over(partition by A order by B) as rn
  from #TEMP
),
R as
(
  select C.A,
         C.B,
         1 as G,
         C.rn
  from C
  where C.rn = 1
  union all
  select C.A,
         C.B,
         G + case when C.B-R.B <= @Diff 
               then 0
               else 1
             end,
         C.rn
  from C
    inner join R
       on R.rn + 1 = C.rn and
          R.A = C.A       
)
select A,
       B,
       dense_rank() over(order by A, G) as G
from R
order by A, G


 类似资料:
  • 问题内容: 我有一个熊猫数据框如下 上面的数据帧有83000行。我想获取两个连续行之间的时间差,并将其保存在单独的列中。理想的结果是 我已经尝试过但出现错误,如下所示 如何解决这个问题 问题答案: 问题是功能需要s或s ,因此首先要转换为,然后得到并除以: 如果需要或每分钟:

  • 问题内容: 我正在尝试一些有关Java中对象相等的代码。正如我在某处阅读 是通过应用哈希函数生成的数字。每个对象的哈希函数可以不同,但​​也可以相同。在对象级别,它返回对象的内存地址。 现在,我有示例程序,该程序连续运行10次。每次我运行程序时,我都会得到与哈希码相同的值。 如果函数返回对象的内存位置,那么java(JVM)如何在连续运行中将对象存储在相同的内存地址? 您能给我一些见解和您对这个问

  • 假设我有一个如下所示的数据框,我需要识别每行,其中一个或多个缺失值 (NA) 后跟至少一个有效值(任何数字)。你可以帮我吗?

  • 问题内容: 我需要查询方面的帮助。 我有这个简单的表: 看起来像这样: 我想为给定的readVal获得最后的连续行: 在上面的示例中将是: id:3 for readVal = 2 id:8 for readVal = 3 我尝试了以下查询: 只要该系列中没有缺失的ID,它就可以工作。在上面的示例中,编号4缺失,查询将不会返回预期的结果。 谢谢! 问题答案: 返回: 对于还需要最后一行的情况: 返

  • 我需要提取和迁移值从一个表到另一个。源表包含一个特定的生效日期的sumarated值。如果一个值被更改,如果组件值上的数据从此生效日期开始有效,则会写入新行。 我现在需要将这些数据迁移到这样的新表中。我们的目标是,选择给定月份的数据,结果就是给定该月份的有效数据。 每行表示在一个月内有效的组件的值。我现在通过将其设置为参数来运行每个有效月份的插入更新。我插入值变化作为新的行到表中,通过使用唯一的键

  • 我对Haskell有点陌生,我试图生成列表的所有连续子列表。 我目前有以下几点: 我知道上面的函数会在删除最后一个元素的情况下生成子列表,但我不知道如何完成伪代码。 我的伪代码基本上是, 拿着完整的清单,去掉尾巴。将(x:xs)的xs传递到列表子列表中 例如,xs=[1,2,3][xs]列表子列表(init xs)将生成[1,2,3,4]、[1,2,3]、[1,2]、[1]、[1]、[1],[1]