2 votes

Comment réduire la taille d'une table SQL lors de la récupération des données ?

Lorsque je récupère des données à l'aide de Select date,type,value from table1 Il affiche les valeurs comme ci-dessous.

enter image description here

Mais je veux le personnaliser comme suit

enter image description here

Quelqu'un peut-il me donner une idée pour y parvenir ?

3voto

DannySlor Points 51

Tout d'abord, nous marquons chaque fois qu'il y a un changement dans les Value en utilisant lag et en ordonnant par Date et ensuite nous count pour créer des groupes distincts.

select    min(date) as "From Date"
         ,max(date) as "To Date"
         ,type
         ,value
from     (
          select  *
                  ,count(chng) over(order by date) as grp
          from   (
                  select *
                         ,case when value <> lag(value) over(order by date) then 1 end as chng
                  from   t
                 ) t
         ) t
group by grp, type, value
order by 1

Date de début

A ce jour

type

valeur

2022-09-21

2022-09-24

S

10

2022-09-25

2022-09-27

S

12

2022-09-28

2022-09-30

S

10

Violon

0voto

L30n1d45 Points 206

Ceci peut être réalisé par MATCH_RECOGNIZE, je ne suis pas sûr que tous les mots-clés soient supportés dans postgres mais cela fonctionne parfaitement dans oracle.

with tbl as (
select '2022-09-21' as "Date", 'S' as "Type", '10' as "Value" from dual union all
select '2022-09-22', 'S', '10' from dual union all
select '2022-09-23', 'S', '10' from dual union all
select '2022-09-24', 'S', '10' from dual union all
select '2022-09-25', 'S', '12' from dual union all
select '2022-09-26', 'S', '12' from dual union all
select '2022-09-27', 'S', '12' from dual union all
select '2022-09-28', 'S', '10' from dual union all
select '2022-09-29', 'S', '10' from dual union all
select '2022-09-30', 'S', '10' from dual)

select
*
from tbl
MATCH_RECOGNIZE (
order by "Date"
measures
first(chg1."Date") as "From Date",
First(chg2."Date") as "To Date",
chg1."Type" as "Type",
chg1."Value" as "Value"
one row per match
pattern(chg1 chg3+ chg2)
define
chg1 as "Value" <> PREV("Value") or (NVL(PREV("Value"),-1) = -1),
chg2 as "Value" <> NEXT("Value") or (NVL(NEXT("Value"),-1) = -1),
chg3 as NOT (("Value" <> PREV("Value") or (NVL(PREV("Value"),-1) = -1))
OR  ("Value" <> NEXT("Value") or (NVL(NEXT("Value"),-1) = -1)))
);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X