数据范围内的重复/多个值Oracle

ffx8fchx  于 2023-11-17  发布在  Oracle
关注(0)|答案(1)|浏览(105)

我有一个多个用户都有更新访问权限的表。表Point_of_saleBrandSub_brandvaluestart_dateend_date
如果user 1将value更新为$10,user 2将value更新为$20,而没有在第一条记录上放置end_date,则会产生差异。我需要找出表中的所有此类值。根据我运行此查询的时间,它应该获得所有活动记录的结果,这意味着在下面的示例中,如果我在2021年6月运行查询,start_date适用于2条记录,因为它> 2021年1月1日和2021年5月5日。
如何使用partition by /order by
| 品牌|子品牌|值|开始日期|结束日期(_D)|
| --|--|--|--|--|
| 银器|勺子| 10 |2020年1月1日|2020年12月20日|
| 银器|勺子| 20 |2021年1月1日||
| 银器|勺子| 30 |2021年5月5日||
查询的预期结果
| 品牌|子品牌|值|开始日期|结束日期(_D)|
| --|--|--|--|--|
| 银器|勺子| 20 |2021年1月1日||
| 银器|勺子| 30 |2021年5月5日||

zwghvu4y

zwghvu4y1#

您似乎希望计算每个品牌/子品牌的NULL值,然后在超过两个时返回NULL值:

SELECT *
FROM   (
  SELECT p.*,
         COUNT(CASE WHEN end_date IS NULL THEN 1 END)
           OVER (PARTITION BY brand, sub_brand) AS num_null
  FROM   point_of_sale p
)
WHERE  num_null > 1
AND    end_date IS NULL;

字符串
其中,对于样本数据:

create table Point_of_sale (Brand, Sub_Brand, Value, START_Date, End_Date) AS
SELECT 'Silverware', 'Spoon', 10, DATE '2020-01-01', DATE '2020-12-20' FROM DUAL UNION ALL
SELECT 'Silverware', 'Spoon', 20, DATE '2021-01-01', NULL FROM DUAL UNION ALL
SELECT 'Silverware', 'Spoon', 30, DATE '2021-05-05', NULL FROM DUAL;


产出:
| 品牌|品牌介绍|值|开始日期|结束日期|NUM_NULL|
| --|--|--|--|--|--|
| 银器|勺子| 30 |2001年5月5日| * 空 *| 2 |
| 银器|勺子| 20 |2021年1月1日| * 空 *| 2 |
如果你想要今天之前的行,那么用途:

SELECT *
FROM   (
  SELECT p.*,
         COUNT(CASE WHEN end_date IS NULL THEN 1 END)
           OVER (PARTITION BY brand, sub_brand) AS num_null
  FROM   point_of_sale p
  WHERE  start_date <= SYSDATE
)
WHERE  num_null > 1
AND    end_date IS NULL;


fiddle

相关问题