Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Przesuwanie niektórych rekordów do końca serii z tą samą datą

To jest skomplikowane. Najpierw musisz znaleźć kolejne rekordy dat, więc z

thedate     theid  thetype
2014-07-12   5001       59
2014-07-12   5002      101
2014-07-12   5003       88
2014-07-13   5004       10
2014-07-12   5005       60

zidentyfikowałbyś 2014-07-12 jako jedno wystąpienie dla pierwszych trzech rekordów, a drugie dla ostatniego rekordu. Drugi rekord musiałby zająć pozycję #3 w Twoich wynikach, a nie #5.

Osiągasz to, nadając kolejnym rekordom klucz grupy za pomocą pierwszego LAG aby zajrzeć do poprzedniego rekordu, tworząc w ten sposób flagę przy zmianie grupy, a następnie kumulując te flagi.

select thedate, theid, thetype
from
(
  select 
    thedate, theid, thetype,
    sum(new_group) over (order by theid) as group_key
  from
  (
    select
      thedate, theid, thetype,
      case when lag(thedate) over (order by theid) = thedate then 0 else 1 as new_group
    from mytable
  ) marked
) grouped
order by 
  group_key,
  case when thetype = 101 then 1 else 0 end,
  theid;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak automatycznie zwiększyć identyfikator w złożonym kluczu podstawowym w Hibernate?

  2. Jak uzyskać pola z listygg w cudzysłowie?

  3. zapytanie, aby zignorować zduplikowane/null rekordy

  4. C#/Oracle:Określ kodowanie/zestaw znaków zapytania?

  5. Dlaczego uruchomienie tego zapytania z EXECUTE IMMEDIATE powoduje jego niepowodzenie?