仅选择一行,按值字段排序

安妮塔

该问题是从Oracle SQL Where Conditions权重扩展而来的,但更笼统(无产品限制,但按产品价值给出一个)。

我有桌子

DROP TABLE mytable;
CREATE TABLE mytable 
(
    product_code VARCHAR2(20 BYTE) NOT NULL ENABLE, 
    priority NUMBER NOT NULL ENABLE, 
    date_act DATE, 
    date_dis DATE
);

填充表格

INSERT INTO mytable (product_code, priority, date_act, date_dis) VALUES ('bla', '0', TO_DATE('2019-01-01', 'YYYY-MM-DD'), TO_DATE('2019-01-31', 'YYYY-MM-DD'));
INSERT INTO mytable (product_code, priority, date_act, date_dis) VALUES ('bla', '1', TO_DATE('2019-02-01', 'YYYY-MM-DD'), TO_DATE('2019-02-28', 'YYYY-MM-DD'));
INSERT INTO mytable (product_code, priority, date_act) VALUES ('bla', '2', TO_DATE('2019-01-01', 'YYYY-MM-DD'));
INSERT INTO mytable (product_code, priority, date_act) VALUES ('bla', '3', TO_DATE('2019-02-01', 'YYYY-MM-DD'));
INSERT INTO mytable (product_code, priority, date_dis) VALUES ('bla', '4', TO_DATE('2019-01-31', 'YYYY-MM-DD'));
INSERT INTO mytable (product_code, priority, date_dis) VALUES ('bla', '5', TO_DATE('2019-02-28', 'YYYY-MM-DD'));
INSERT INTO mytable (product_code, priority) VALUES ('bla', '6');
INSERT INTO mytable (product_code, priority) VALUES ('bla', '7');

INSERT INTO mytable (product_code, priority, date_act, date_dis) VALUES ('foo', '0', TO_DATE('2019-01-01', 'YYYY-MM-DD'), TO_DATE('2019-01-31', 'YYYY-MM-DD'));
INSERT INTO mytable (product_code, priority, date_act) VALUES ('foo', '1', TO_DATE('2019-02-01', 'YYYY-MM-DD'));
INSERT INTO mytable (product_code, priority, date_dis) VALUES ('foo', '2', TO_DATE('2019-01-31', 'YYYY-MM-DD'));
INSERT INTO mytable (product_code, priority) VALUES ('foo', '3');


INSERT INTO mytable (product_code, priority, date_act, date_dis) VALUES ('tmp', '0', TO_DATE('2019-01-01', 'YYYY-MM-DD'), TO_DATE('2019-01-31', 'YYYY-MM-DD'));
INSERT INTO mytable (product_code, priority, date_act) VALUES ('tmp', '1', TO_DATE('2019-01-01', 'YYYY-MM-DD'));
INSERT INTO mytable (product_code, priority, date_dis) VALUES ('tmp', '2', TO_DATE('2019-02-28', 'YYYY-MM-DD'));
INSERT INTO mytable (product_code, priority) VALUES ('tmp', '3');

内容

SELECT * FROM mytable;

和输出

PRODUCT_CODE           PRIORITY DATE_ACT  DATE_DIS 
-------------------- ---------- --------- ---------
bla                           0 01-JAN-19 31-JAN-19
bla                           1 01-FEB-19 28-FEB-19
bla                           2 01-JAN-19          
bla                           3 01-FEB-19          
bla                           4           31-JAN-19
bla                           5           28-FEB-19
bla                           6                    
bla                           7                    
foo                           0 01-JAN-19 31-JAN-19
foo                           1 01-FEB-19          
foo                           2           31-JAN-19
foo                           3                    
tmp                           0 01-JAN-19 31-JAN-19
tmp                           1 01-JAN-19          
tmp                           2           28-FEB-19
tmp                           3                    

条件定义

  • condition_weight 4:当行具有date_actdate_dis定义。
  • condition_weight 3:当行已date_dis定义但date_act尚未定义时
  • condition_weight 2:当行已date_act定义但date_dis尚未定义时
  • condition_weight 1:当行具有date_actdate_dis没有定义。

如果condition_weight 4为true,则左侧(3、2和1)将被忽略。

如果condition_weight 4为false且condition_weight 3为true,则condition_weight 2和condition_weight 1将被忽略。

如果condition_weight 4和3为false,而condition_weight 2为true,则condition_weight 1将被忽略。

如果condition_weight 4、3和2为false,则仅对condition_weight 1进行评估。

问题:如何通过每一只获得一排product_code,其优先级最高,与输入参数date_submit与条件权值定义?

需要输出示例 注意:下表结果是手动创建的(我需要类似的结果,但是没有查询)。

DATE_SUBMIT:='2019/01/15'

CONDITION_WEIGHT       PRIO PRODUCT_CODE           PRIORITY DATE_ACT  DATE_DIS  :DATE_SUBMIT                                                                                                                    
---------------- ---------- -------------------- ---------- --------- --------- --------------------------------------------------------------------------------------------------------------------------------
               4          0 bla                           0 01-JAN-19 31-JAN-19 2019/01/15                                                                                                                      
               4          0 foo                           0 01-JAN-19 31-JAN-19 2019/01/15                                                                                                                      
               4          0 tmp                           0 01-JAN-19 31-JAN-19 2019/01/15                                                                                                                      

DATE_SUBMIT:='2019/02/15'

CONDITION_WEIGHT       PRIO PRODUCT_CODE           PRIORITY DATE_ACT  DATE_DIS  :DATE_SUBMIT                                                                                                                    
---------------- ---------- -------------------- ---------- --------- --------- --------------------------------------------------------------------------------------------------------------------------------
               4          1 bla                           1 01-FEB-19 28-FEB-19 2019/02/15                                                                                                                      
               2          1 foo                           1 01-FEB-19           2019/02/15                                                                                                                      
               3          2 tmp                           2           28-FEB-19 2019/02/15                                                                                                                      

DATE_SUBMIT:='2018/12/31'

CONDITION_WEIGHT       PRIO PRODUCT_CODE           PRIORITY DATE_ACT  DATE_DIS  :DATE_SUBMIT                                                                                                                    
---------------- ---------- -------------------- ---------- --------- --------- --------------------------------------------------------------------------------------------------------------------------------
               3          5 bla                           5           28-FEB-19 2018/12/31                                                                                                                      
               3          2 foo                           2           31-JAN-19 2018/12/31                                                                                                                      
               3          2 tmp                           2           28-FEB-19 2018/12/31                                                                                                                      

DATE_SUBMIT:='2019/12/31'

CONDITION_WEIGHT       PRIO PRODUCT_CODE           PRIORITY DATE_ACT  DATE_DIS  :DATE_SUBMIT                                                                                                                    
---------------- ---------- -------------------- ---------- --------- --------- --------------------------------------------------------------------------------------------------------------------------------
               2          3 bla                           3 01-FEB-19           2019/12/31                                                                                                                      
               2          1 foo                           1 01-FEB-19           2019/12/31                                                                                                                      
               2          1 tmp                           1 01-JAN-19           2019/12/31                                                                                                                      

检查答案https://stackoverflow.com/a/59779653/1410223结果,但是否有可能使查询更简单。

编辑只有priority最高的priority必须是。

思考长臂猿

使用分配条件权重case when然后针对每种产品采取最佳排法,使用rank()

with 
  d as (select date '2019-02-15' date_submit from dual),
  t as (
    select m.*, case 
                when date_act is not null and date_dis is not null then 4 
                when date_act is null and date_dis is not null then 3
                when date_act is not null and date_dis is null then 2
                else 1 end condition
      from mytable m)
select product_code, priority, date_act, date_dis, condition, date_submit 
  from (
    select t.*, d.*, 
           rank() over ( partition by product_code order by condition desc ) rnk
      from t join d 
        on date_submit between nvl(date_act, date_submit) and nvl(date_dis, date_submit))
  where rnk = 1

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

选择最小值并仅返回第一行

来自分类Dev

数据表LINQ选择数据行仅返回一行以及如何排序

来自分类Dev

如果表按日期排序,如何在MySQL的特定行之前选择一行?

来自分类Dev

MySQL LEFT JOIN仅一行,按列排序,不带子查询

来自分类Dev

MySQL LEFT JOIN仅一行,按列排序,不带子查询

来自分类Dev

仅按第一行对3D矩阵进行排序

来自分类Dev

通过一对多关系表仅选择具有最大字段的一行

来自分类Dev

SQL:从词法排序表中仅选择第一行

来自分类Dev

每个唯一列值限制一行,按最大列值选择

来自分类Dev

jqgrid每组仅选择一行

来自分类Dev

每个类别仅选择一行

来自分类Dev

PHP仅选择第一行?

来自分类Dev

SQL仅选择第一行

来自分类Dev

XSLT:仅选择最后一行

来自分类Dev

按升序选择最后一行

来自分类Dev

Mysql Query从相同的值中选择一行(仅选择重复项)

来自分类Dev

我按asc排序时,查询仅显示第一行数据,但按desc过滤时,查询正常

来自分类Dev

按第一个字段在一行中转换值

来自分类Dev

PHP仅允许在排序数组中包含特定值的一行

来自分类Dev

按同一行上不同值之间的最大差异排序

来自分类Dev

按列值对数据框中的每一行进行排序

来自分类Dev

Python 3:按最后一行的列值排序DF的字典

来自分类Dev

根据最后一行的值按列对Deedle Frame进行排序

来自分类Dev

SQL Server-对于字段的每个不同值仅获取一行

来自分类Dev

熊猫 按字段分组并将值合并为一行

来自分类Dev

SQL在选择子查询中仅返回一行或空值

来自分类Dev

SQL:仅选择具有相同值的表的一行

来自分类Dev

仅选择具有匹配列表列值的一行

来自分类Dev

如何仅选择第一行和具有相同值的多行中的特定列?

Related 相关文章

  1. 1

    选择最小值并仅返回第一行

  2. 2

    数据表LINQ选择数据行仅返回一行以及如何排序

  3. 3

    如果表按日期排序,如何在MySQL的特定行之前选择一行?

  4. 4

    MySQL LEFT JOIN仅一行,按列排序,不带子查询

  5. 5

    MySQL LEFT JOIN仅一行,按列排序,不带子查询

  6. 6

    仅按第一行对3D矩阵进行排序

  7. 7

    通过一对多关系表仅选择具有最大字段的一行

  8. 8

    SQL:从词法排序表中仅选择第一行

  9. 9

    每个唯一列值限制一行,按最大列值选择

  10. 10

    jqgrid每组仅选择一行

  11. 11

    每个类别仅选择一行

  12. 12

    PHP仅选择第一行?

  13. 13

    SQL仅选择第一行

  14. 14

    XSLT:仅选择最后一行

  15. 15

    按升序选择最后一行

  16. 16

    Mysql Query从相同的值中选择一行(仅选择重复项)

  17. 17

    我按asc排序时,查询仅显示第一行数据,但按desc过滤时,查询正常

  18. 18

    按第一个字段在一行中转换值

  19. 19

    PHP仅允许在排序数组中包含特定值的一行

  20. 20

    按同一行上不同值之间的最大差异排序

  21. 21

    按列值对数据框中的每一行进行排序

  22. 22

    Python 3:按最后一行的列值排序DF的字典

  23. 23

    根据最后一行的值按列对Deedle Frame进行排序

  24. 24

    SQL Server-对于字段的每个不同值仅获取一行

  25. 25

    熊猫 按字段分组并将值合并为一行

  26. 26

    SQL在选择子查询中仅返回一行或空值

  27. 27

    SQL:仅选择具有相同值的表的一行

  28. 28

    仅选择具有匹配列表列值的一行

  29. 29

    如何仅选择第一行和具有相同值的多行中的特定列?

热门标签

归档