SAP HANA SQL用于比较行项目

SAP HANA SQL用于比较行项目,sql,hana,hana-sql-script,Sql,Hana,Hana Sql Script,问题: 我如何在其他文件编号中找到文件编号中至少X百分比(例如>=50%)匹配的材料 创建表: CREATE COLUMN TABLE "SCHEMA"."MYTABLE" ( "DOCUMENT" NVARCHAR(10) DEFAULT '' NOT NULL , "POSNR" NVARCHAR(6) DEFAULT '000000' NOT NULL , "MATERIAL" NVARCHAR(40) DEFAULT '' NOT NULL, PRIMAR

问题: 我如何在其他文件编号中找到文件编号中至少X百分比(例如>=50%)匹配的材料

创建表:

CREATE COLUMN TABLE "SCHEMA"."MYTABLE" 
(
     "DOCUMENT" NVARCHAR(10) DEFAULT '' NOT NULL ,
     "POSNR" NVARCHAR(6) DEFAULT '000000' NOT NULL ,
     "MATERIAL" NVARCHAR(40) DEFAULT '' NOT NULL,
PRIMARY KEY (
     "DOCUMENT",
     "POSNR")
     ) UNLOAD PRIORITY 5 AUTO MERGE 
;
插入数据:

INSERT INTO MYTABLE VALUES (100, '10', 'R3');
INSERT INTO MYTABLE VALUES (100, '20', '7000000');
INSERT INTO MYTABLE VALUES (100, '30', '7000010');
INSERT INTO MYTABLE VALUES (100, '40', '7000011');
INSERT INTO MYTABLE VALUES (100, '50', '7000160');

INSERT INTO MYTABLE VALUES (200, '10', 'SW');
INSERT INTO MYTABLE VALUES (200, '20', '7000000');
INSERT INTO MYTABLE VALUES (200, '30', '7000010');
INSERT INTO MYTABLE VALUES (200, '40', '7000011');
INSERT INTO MYTABLE VALUES (200, '50', '7000160');
INSERT INTO MYTABLE VALUES (200, '60', '7000036');
INSERT INTO MYTABLE VALUES (200, '70', '7000040');
INSERT INTO MYTABLE VALUES (200, '80', '7000066');
INSERT INTO MYTABLE VALUES (200, '90', '7000068');

INSERT INTO MYTABLE VALUES (300, '01', '7000160');
INSERT INTO MYTABLE VALUES (300, '11', '7000011');

INSERT INTO MYTABLE VALUES (400, '10', '7000033');
INSERT INTO MYTABLE VALUES (400, '20', '7000034');
INSERT INTO MYTABLE VALUES (400, '50', '7000068');
INSERT INTO MYTABLE VALUES (400, '60', '7000079');

这确实可以在不使用游标的情况下解决

with doc_elements 
(document, material, material_cnt)  
as  (select distinct
          document
        , material
        , count( *) OVER
            (PARTITION BY document) as MATERIAL_CNT
    from
        mytable
    )  
, matched_materials 
(document_a, material, material_b_cnt, document_b, match_cnt)  
as  (select
         side_a.document as document_a
       , side_a.material
       , side_b.material_cnt as material_a_cnt
       , side_b.document doc_b
       , count(*) OVER
            (PARTITION BY side_a.document, side_b.document) as match_cnt
    from 
                        doc_elements side_a
        left outer join doc_elements side_b
                on   side_a.material = side_b.material
                and side_a.document != side_b.document
     where 
            side_b.document IS NOT NULL
    )      
select distinct
    document_a
  --, material
  , document_b
  , material_b_cnt
  , match_cnt
  , round((100/material_b_cnt)*match_cnt, 2) as match_pct
from 
    matched_materials
order by
    document_a
  , document_b;
此语句返回:

DOCUMENT_A|DOCUMENT_B|MATERIAL_B_CNT|MATCH_CNT|MATCH_PCT|
----------|----------|--------------|---------|---------|
100       |200       |             9|        4|    44.44|
100       |300       |             2|        2|      100|

200       |100       |             6|        4|    66.67|
200       |300       |             2|        2|      100|
200       |400       |             4|        1|       25|

300       |100       |             6|        2|    33.33|
300       |200       |             9|        2|    22.22|

400       |200       |             9|        1|    11.11|
为了简单起见,我将
R3
SW
视为常规材料。
输出仅包含至少有一个物料匹配的文档映射(请参见
side_b.在
matched_material
公共表表达式中的document NOT NULL
条件)

请注意,注释中的结果规范包含错误:
文件400没有匹配项,因为材料700068不是文件100的材料的一部分


我将这个问题作为一个提示,更广泛地介绍这个解决方案,并包括对查询性能和调优选项的回顾

看 及
为此



请提供
CREATE TABLE
INSERT
命令,以确保数据结构没有歧义。@LarsBr。我已经用这些信息更新了我最初的帖子。感谢您提供了表和数据定义。现在问题还不太清楚。是否要查找与其他文档共享的占材料数量X%的文档?请同时显示所需的输出。另外:一份文件中是否有唯一的材料?e、 g.物料700000在文档100中只能出现一次吗?@LarsBr。很抱歉给你带来了困惑。材料不是唯一的,例如文件100可能包含POSNR 60的材料700000。在上面的示例中,我想找到以下内容:文档100中有700000、700010、700011、700160个材料,这些材料在文档200中都有4x命中率((100/9)*4=44,4%匹配),在文档300中我发现2x材料中有2x命中率((100/2)*2=100%匹配),在文档400中我只找到1x命中率(700068),这应该给我(100/4)*1=25%匹配添加的描述更好地阐明了要求,但也意味着我必须调整我的解决方案。我会在接下来的几天内发布。同时,如果您能解释一下此处是否应考虑
R3
SW
条目,或者材料的规则是什么,那就更好了。