1

現在のステータスと、このステータスが適用される日付を報告する必要があるテーブルがあります。例:

Status   date
1        26 July
1        24 July
1        22 July
2        21 July
2        19 July
1        16 July
0        14 July

これを考えると、現在のステータスを1、日付を7月22日として表示したい>どうすればいいのかわかりません。

Status   date
    1        25 July
    1        24 July
    1        20 July

この場合、ステータスを 1、日付を 7 月 20 日として表示したい

4

3 に答える 3

1

これは、非常に標準的な SQL を使用して必要なものを取得する必要があります。

-- Get the oldest date that is the current Status
select Status, min(date) as date
from MyTable
where date > (
    -- Get the most recent date that isn't the current Status
    select max(date)
    from MyTable
    where Status != (
        -- Get the current Status
        select Status -- May need max/min here for multiple statuses on same date
        from MyTable
        where date = (
            -- Get the most recent date
            select max(date)
            from MyTable
        )
    )
)
group by Status

列は適切にソートするのに適したデータ型であると想定していdateます(キャストできない限り、文字列ではありません)。

于 2012-07-27T16:57:29.337 に答える
0

LEADもう 1 つのオプションは、 (またはLAG結果の順序に応じて) のようなウィンドウ関数を使用することです。この例では、ステータスが日付とともに変化したときに行をマークし、結果を並べ替えて、最初の行以外の行を除外します。

with test_data as (
      select 1 status, date '2012-07-26' status_date from dual union all
      select 1 status, date '2012-07-24' status_date from dual union all
      select 1 status, date '2012-07-22' status_date from dual union all
      select 2 status, date '2012-07-21' status_date from dual union all
      select 2 status, date '2012-07-19' status_date from dual union all
      select 1 status, date '2012-07-16' status_date from dual union all
      select 0 status, date '2012-07-14' status_date from dual)

select status, as_of
from (
    select status
    , case when status != lead(status) over (order by status_date desc) then status_date else null end as_of
    from test_data
    order by as_of desc nulls last
    )
where rownum = 1;

補遺:LEADおよびLAG関数は、さらに 2 つのパラメーターを受け入れます :offsetおよびdefault。デフォルトはoffset1 で、defaultデフォルトは null です。デフォルトでは、結果セットの先頭または末尾にいるときに考慮する値を決定できます。ステータスが変更されていない場合、デフォルトが必要です。この例では、ステータス値が期待されるセットの一部ではないと想定しているため、ステータスのデフォルトとして -1 を指定しました。

with test_data as (
      select 1 status, date '2012-07-25' status_date from dual union all
      select 1 status, date '2012-07-24' status_date from dual union all
      select 1 status, date '2012-07-20' status_date from dual)

select status, as_of
from (
    select status
    , case when status != lead(status,1,-1) over (order by status_date desc) then status_date else null end as_of
    from test_data
    order by as_of desc nulls last
    )
where rownum = 1; 

ケース条件 (equals/not equals)、lead 関数の order by 句、および目的のデフォルトをいじって、ニーズを満たすことができます。

于 2012-07-27T17:04:08.907 に答える
0

これは少しエレガントではありませんが、うまくいくはずです

SELECT status, date
FROM my_table t
WHERE status = ALL (SELECT status
                    FROM my_table
                    WHERE date = ALL(SELECT MAX(date) FROM my_table))
AND date = ALL (SELECT MIN(date) 
                FROM my_table t1
                WHERE t1.status = t.status 
                AND NOT EXISTS (SELECT * 
                                  FROM my_table t2 
                                  WHERE t2.date > t1.date AND t2.status <> t1.status))
于 2012-07-27T16:30:37.773 に答える