mysql时间段重叠_MySQL - 如何选择'DISTINCT'重叠时段(日期或数字范围)

简单地说,如果查询告诉我A重叠B,那么我不需要它也告诉我B重叠A,因为它们彼此重叠。

所以我想在sql中使用自联接来选择'DISTINCT'重叠。

为了说明,这里是我写的一个简单的SQL小提琴,用于显示包含重叠选择(http://sqlfiddle.com/#!9/7af84f/1)

详细...

假设我有一个名称(char),d1(int),d2(int)的表格,其架构如下。这里,d1和d2表示可能与同一个表中的另一个区间重叠的某个区间的开始和结束。

CREATE TABLE test (

letter char ,

d1 int ,

d2 int

) ;鉴于这张表,我填写了一些值

INSERT INTO test (letter,d1,d2)

VALUES

('A', 2, 10), -- overlaps C and D

('B', 12, 20), -- overlaps E

('C', 5, 10), -- overlaps A and D

('D', 1, 8), -- overlaps A and C

('E', 13, 15), -- overlaps B

('F', 25, 30); -- doesn't overlap anything并运行以下使用自联接的查询来正确查找其中一行中的d1和d2与其他行中的d1和d2重叠的行。

-- selects all records that overlap in the range d1 - d2 inclusive

-- (excluding the implicit overlap between a record and itself)

-- The results are sorted by letter followed by d1

SELECT

basetable.letter as test_letter,

basetable.d1,

basetable.d2,

overlaptable.letter as overlap_letter,

overlaptable.d1 as overlap_d1,

overlaptable.d2 as overlap_d2

FROM

test as basetable,

test as overlaptable

WHERE

-- there is an inclusive overlap

basetable.d1 <= overlaptable.d2 and basetable.d2 >= overlaptable.d1

AND

-- the row being checked is not itsself

basetable.letter <> overlaptable.letter

AND

basetable.d1 <> overlaptable.d1

AND

basetable.d2 <> overlaptable.d2

ORDER BY

basetable.letter,

basetable.d1这正确地给了我以下内容,显示所有6个版本的重叠,例如,左边的列表示A重叠C,另一行显示C重叠A(注意sqlfiddle似乎不理解字段别名,因此我的列标题不同)

test_letter d1 d2 overlap_letter overlap_d1 overlap_d2

A 2 10 D 1 8

B 12 20 E 13 15

C 5 10 D 1 8

D 1 8 A 2 10

D 1 8 C 5 10

E 13 15 B 12 20我的问题是这样的:

我怎样才能改变SQL来获得四行'DISTINCT'或'单向'重叠?

即这个结果...

test_letter d1 d2 overlap_letter overlap_d1 overlap_d2

A 2 10 D 1 8

A 2 10 C 5 10

B 12 20 E 13 15

C 5 10 D 1 8例如:点击

根据以下推理在左侧栏中显示A,B和C的记录的结果

A(2,10)与D(1,8)和C(5,10)以及{显示这两行}重叠

B(12,20)与E(13,15){显示此行}重叠

C(5,10)与D(1,8)重叠{显示此行但不显示A(1,10)重叠,因为行2已经显示A和C重叠}

D(1,8){因为我们已经知道A(1,10)和C(5,10)},所以不要显示任何新东西。

E(13,15){因为我们已经知道B(12,20)},所以不会显示任何新东西。“

F(25,30){不要显示任何内容,因为没有重叠}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以hive的角度检查语法: with cur_dim_comb as (SELECT DISTINCT t.dim_comb ,t.var_sub_class ,t.acc_value FROM gerp.cux_cst_data_alloc_his t WHERE t.top_var_type = '10' AND t.job_ver_id in (SELECT ver.job_ver_id AS p_job_ver_id FROM gerp.cux_cst_dist_jobs_all job INNER JOIN gerp.cux_cst_dist_jobs_vers_all ver ON job.job_id = ver.job_id )) select tp.bd_code --事业部编码 ,tp.bd_name --事业部名称 ,hp.ou_code --OU名称 ,hp.ou_name --OU编码 ,op.main_class_desc --差异大类 ,op.acc_value --科目代码 ,op.acc_desc --科目名称 ,op.dim_comb --区分维度 ,op.begin_amount --期初余额 ,op.accrual_amount --本期发生 ,op.balance_diff_alloc_amount --期末差异结存 ,op.var_sub_class ,op.main_class_value ,op.org_id ,op.period_name ,op.job_ver_id from (select up.* ,q1.* from (SELECT DISTINCT maincl.* ,t.* FROM t inner join (SELECT fv.flex_value ,fv.description FROM fv inner join fs on fv.flex_value_set_id = fs.flex_value_set_id AND fs.flex_value_set_name = 'CUX_CST_VARIANCE_TYPE' AND fv.enabled_flag = 'Y' AND fv.hierarchy_level = '2' AND fv.flex_value LIKE '10%' ) maincl on t.var_main_class = maincl.flex_value inner join cur_dim_comb on cur_dim_comb.var_sub_class = t.var_sub_class and cur_dim_comb.acc_value = t.acc_value WHERE 1 = 1 AND t.top_var_type = '10' AND t.job_ver_id in (SELECT ver.job_ver_id AS p_job_ver_id FROM gerp.cux_cst_dist_jobs_all job INNER JOIN gerp.cux_cst_dist_jobs_vers_all ver ON job.job_id = ver.job_id) ORDER BY maincl.description ,t.acc_value ,cur_dim_comb.dim_comb ) up inner join (SELECT t1.* ,SUM(t1.begin_amount) begin_amount ,SUM(t1.accrual_amount) accrual_amount ,SUM(t1.balance_diff_alloc_amount) balance_diff_alloc_amount FROM gerp.cux_cst_data_alloc_his t1 LEFT JOIN gerp.cux_cst_data_alloc_his t ON t1.top_var_type = '10' AND t1.var_sub_class = t.var_sub_class --p_var_sub_class AND t1.org_id = t.org_id --p_org_id AND t1.period_name = t.period_name --p_period_name AND t1.job_ver_id = t.job_ver_id --p_job_ver_id AND t1.acc_value = t.acc_value --p_acc_value WHERE t1.dim_comb in (select distinct dim_comb from cur_dim_comb) group by t1.org_id,t1.period_name,t1.job_ver_id,t1.var_sub_class,t1.acc_value ) q1 on q1.org_id = up.org_id --p_org_id AND q1.period_name = up.period_name --p_period_name AND q1.job_ver_id = up.job_ver_id --p_job_ver_id AND q1.var_sub_class = up.var_sub_class --p_var_sub_class AND q1.acc_value = up.acc_value --p_acc_value ) op
05-26
从 Hive 的角度来检查语法,以下是您提供的 SQL 查询语句: ``` with cur_dim_comb as ( SELECT DISTINCT t.dim_comb, t.var_sub_class, t.acc_value FROM gerp.cux_cst_data_alloc_his t WHERE t.top_var_type = '10' AND t.job_ver_id in ( SELECT ver.job_ver_id AS p_job_ver_id FROM gerp.cux_cst_dist_jobs_all job INNER JOIN gerp.cux_cst_dist_jobs_vers_all ver ON job.job_id = ver.job_id ) ) select tp.bd_code, --事业部编码 tp.bd_name, --事业部名称 hp.ou_code, --OU名称 hp.ou_name, --OU编码 op.main_class_desc, --差异大类 op.acc_value, --科目代码 op.acc_desc, --科目名称 op.dim_comb, --区分维度 op.begin_amount, --期初余额 op.accrual_amount, --本期发生 op.balance_diff_alloc_amount, --期末差异结存 op.var_sub_class, op.main_class_value, op.org_id, op.period_name, op.job_ver_id from ( select up.*, q1.* from ( SELECT DISTINCT maincl.*, t.* FROM t inner join ( SELECT fv.flex_value, fv.description FROM fv inner join fs on fv.flex_value_set_id = fs.flex_value_set_id AND fs.flex_value_set_name = 'CUX_CST_VARIANCE_TYPE' AND fv.enabled_flag = 'Y' AND fv.hierarchy_level = '2' AND fv.flex_value LIKE '10%' ) maincl on t.var_main_class = maincl.flex_value inner join cur_dim_comb on cur_dim_comb.var_sub_class = t.var_sub_class and cur_dim_comb.acc_value = t.acc_value WHERE 1 = 1 AND t.top_var_type = '10' AND t.job_ver_id in ( SELECT ver.job_ver_id AS p_job_ver_id FROM gerp.cux_cst_dist_jobs_all job INNER JOIN gerp.cux_cst_dist_jobs_vers_all ver ON job.job_id = ver.job_id ) ORDER BY maincl.description, t.acc_value, cur_dim_comb.dim_comb ) up inner join ( SELECT t1.*, SUM(t1.begin_amount) begin_amount, SUM(t1.accrual_amount) accrual_amount, SUM(t1.balance_diff_alloc_amount) balance_diff_alloc_amount FROM gerp.cux_cst_data_alloc_his t1 LEFT JOIN gerp.cux_cst_data_alloc_his t ON t1.top_var_type = '10' AND t1.var_sub_class = t.var_sub_class --p_var_sub_class AND t1.org_id = t.org_id --p_org_id AND t1.period_name = t.period_name --p_period_name AND t1.job_ver_id = t.job_ver_id --p_job_ver_id AND t1.acc_value = t.acc_value --p_acc_value WHERE t1.dim_comb in (select distinct dim_comb from cur_dim_comb) group by t1.org_id, t1.period_name, t1.job_ver_id, t1.var_sub_class, t1.acc_value ) q1 on q1.org_id = up.org_id --p_org_id AND q1.period_name = up.period_name --p_period_name AND q1.job_ver_id = up.job_ver_id --p_job_ver_id AND q1.var_sub_class = up.var_sub_class --p_var_sub_class AND q1.acc_value = up.acc_value --p_acc_value ) op ``` 从语法角度来看,该查询语句是有效的。但是,如果您想要确保语句完全符合您的预期,请先测试该语句在您的环境中的执行结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值