我有两张数字表。我需要按顺序加入它们。我正在寻找最有效的方法来做到这一点。其实。我正在处理日期,但为了简单起见,我将用数字解释。
TABLE 1 has data 1, 3, 6, 8
TABLE 2 has data 1.1, 2.3, 4.5, 6.5, 8.8, 8.9
我想要值> = 1和< 3 ...> = 3且< 6 ...> = 6< 8等
我想要一个像
这样的结果1 1.1
1 2.3
3 4.5
6 6.5
8 8.8
8 8.9
所以,基本上我想要值> =我当前的行但是<然后是下一排。
我需要它非常高效,因为它将使用日期而不是数字在大型数据集上运行。
答案 0 :(得分:2)
试试这个。
create TABLE #table1 (data int)
insert #table1
values(1), (3),( 6), (8 )
create TABLE #table2 (data numeric(6,2))
insert #table2 values
(1.1), (2.3), (4.5), (6.5), (8.8), (8.9)
SELECT Max(col1)col1,
col2
FROM (SELECT CASE
WHEN a.data < b.data THEN a.data
END col1,
b.data col2
FROM #table1 a
CROSS JOIN #table2 b) a
WHERE col1 IS NOT NULL
GROUP BY col2
<强>输出强>
+-----+-----+
|col1 | col2|
+-----+-----+
|1 | 1.10|
|1 | 2.30|
|3 | 4.50|
|6 | 6.50|
|8 | 8.80|
|8 | 8.90|
+-----+-----+
答案 1 :(得分:1)
这可行但需要测试性能:
SELECT
T1.DATA,
T2.DATA
FROM
Table1 T1
JOIN Table2 T2 ON T2.Data >= T1.DATA AND
T2.Data < ISNULL(
(
SELECT TOP 1
TT1.Data
FROM
Table1 TT1
WHERE
TT1.Data > T1.Data
ORDER BY
TT1.DATA
), T2.Data + 1)
答案 2 :(得分:1)
这里的表现很好:
CREATE TABLE t1(data int)
CREATE TABLE t2(data numeric(18,2))
INSERT INTO t1
VALUES(1), (3),(6), (8)
INSERT INTO t2
VALUES (1.1), (2.3), (4.5), (6.5), (8.8), (8.9)
WITH CTE AS
(SELECT ROW_NUMBER() OVER (ORDER BY data) AS rn, data FROM t1)
SELECT a.data,z.data
FROM CTE a
LEFT JOIN CTE b ON a.rn+1 = b.rn
CROSS APPLY (SELECT * FROM t2 x
WHERE x.data >= a.data AND x.data < ISNULL(b.data,999999999)) z