過去の桐井戸端BBS (桐ver.9)
25227 グループ内で日付項目に最新日付が入ったレコードを抽出したい クーパー 2004/03/04-15:04
よろしくお願いします。

商品 販売日付
1  1996/10/21
1  2004/ 3/ 1
3  2004/11/15
3  1999/ 4/ 4

商品の種類ごとに最新の販売日付を抽出したいのですがうまくいきません。
商品=昇順、販売日付=降順で並び替えしてから単一化では必ずしも最新の日付で残らないようなのです。
他に確実な方法はありますか?
25234 日付データの確認をしてみて下さい 佐田 守弘 2004/03/04-18:19
記事番号25227へのコメント
クーパーさん
私の経験では、単一化した場合に、先頭行が1行だけ取り出されると思いました。
原因は日付の書式のためという事はないでしょうか。

データは、
 >商品 販売日付
 >1  1996/10/21
 >1  2004/ 3/ 1
 >3  2004/11/15
 >3  1999/ 4/ 4
と書かれておりますが、この日付データは日時型でしょうか文字列型でしょうか。
日時型であれば問題ありません。

文字列型の場合、書かれているデータでは数字が1桁の場合にはスペースが入っている様ですが、これに間違いないでしょうか。
もしも一部にスペースがないデータが混じっているとしたら、並べ替えがうまくできずに、質問の様な事が起きる事が考えられます。

佐田守弘(KS-00119)
25273 Re:日付データの確認をしてみて下さい クーパー 2004/03/05-16:02
記事番号25234へのコメント
佐田さん、お返事ありがとうございました。

販売日付のデータ型はちゃんと日時型になっていたのですが、
単一化によって絞り込むべき要素がもうひとつ抜けていました。
ものすごく恥ずかしいです…

参考に他の方法で同様の抽出結果を得る方法はあるでしょうか。
こんなやりかたもあるよとご存知の方いらっしゃいましたら
教えていただければ嬉しいです。
25279 非効率でよければ、別の方法もあります 佐田 守弘 2004/03/05-23:10
記事番号25273へのコメント
クーパーさん
効率を度外視すれば、様々な別解が考えられます。
そして結論的には単一化の絞り込みを行うのが最も簡単で効率的な方法です。

 >参考に他の方法で同様の抽出結果を得る方法はあるでしょうか。
との事ですので、敢て思いつくままに別解を紹介してみます。

●「#順位」関数を使う方法
この関数を使って、2つ以上の項目を指定して置換を行うと、それらの項目値が同じグループに対して、上から順に連番号を振れます。
予めそれらの項目で並べ替えを行っておいてから、置換を実行します。
この後、順位が1のレコードを絞り込めば、単一化と同じ結果になります。
質問のケースで言えば、日付以外にもう1つグループ化する項目がある事と、
順位の値を書き込む項目を作っておく必要があります。

●一括処理でゴリゴリと処理する方法
これもチェック用の項目(仮に[選択]とする)を作っておきます。
そして、必要な順序で並べ替えを行った後、レコードを上から下まで順に移動しながら、
日付およびその他のグループ化する項目について、直前行の値と変わっていれば、
[選択]に1を、それ以外は0を書き込みます。
その後、[選択]の値が1のレコードを選びます。
一括処理では#直前値関数が使えないので、直前行の値を変数に記録しておいて、
比較を行う必要があります。

●直前行との違いを項目計算式で判定する方法
上記と同じ様に[選択]の項目を作っておき、ここに次の項目計算式を設定するか、
置換を行うかします。
 #条件選択(#[日付]=#直前値([日付],d"1900-1-1"),0,1,1)
その結果が1であるレコードを選びます。

●もう1つの一括処理で行う方法
やはり並べ替えを行っておき、先頭行の値を調べます。そして値が同じレコードを絞り込みます。
次に[選択]の全行を0に置換した後、先頭行だけ1に書き換えます。
以上の後補集合を取って、上記を繰り返します。
この繰り返しを、対象行が無くなるまで行った後、全解除してから[選択]が1のレコードを絞り込みます。

以上の様に、いろいろと別解は考えられます。
多分これ以外にもあり得るでしょう。
しかし、処理としては単一化を行う方が簡単だと思います。

●クイズのつもりで...
お時間のある時にでも、クイズのつもりで、これ以外の方法を御自身で考えて見る事を是非お勧めします。
そして、新しい方法を思いついたらば、その結果ではなく、
どの様にしてその様な方法にたどり着いたのか、という過程を振り返り、
これを大切に育てて下さい。
桐だけでなく、様々な創造力の育成には、最適なトレーニングかと思います。
そしてそういった頭の柔軟さを磨く事が、仕事の上でも役立ちますし、
長い目で見れば、老化防止と長寿に役立つものと思っております。

佐田守弘(KS-00119)
25284 宿題がんばります。 クーパー 2004/03/06-16:22
記事番号25279へのコメント
佐田さん、ご丁寧にありがとうございます。
大変参考になります。

ひょっとしたら自分が非効率なことをやっているのかも
との思いがいつもついて廻るので少し安心しました。

>●「#順位」関数を使う方法
最初はこれでやってました。
日時型の扱いが苦手なんです。

>●一括処理でゴリゴリと処理する方法
>●直前行との違いを項目計算式で判定する方法
>●もう1つの一括処理で行う方法
ほかのテーブルの作業で考えていたものの
答えをもらってしまった(笑)
ありがとうございます。

>●クイズのつもりで...
仕事上時間は限りなく許してくれないのですが…
>老化防止と長寿に役立つものと思っております。
  ↑
これに期待して今後も頑張ります。
ありがとうございました。
25288 Re:宿題がんばります。 うにん 2004/03/06-22:24
記事番号25284へのコメント
「グループごとの」値なので、行集計か結合表でやるのが素直じゃないでしょうか。
集計関数で得られない値の場合は他の方法になりますが。
25291 行集計の手もありますね。 佐田 守弘 2004/03/06-23:11
記事番号25288へのコメント
うにんさん
>「グループごとの」値なので、行集計か結合表でやるのが素直じゃないでしょ
>うか。
成程!。その手もありました。
確か同じグループの先頭行を取り出したいといった条件があったので、
考慮外にしてしまいましたが、目的項目について逆順に整列しておけば、取れますね。

佐田守弘(KS-00119)
25292 日時型は苦手ですか?(苦手な原因と対策) 佐田 守弘 2004/03/06-23:19
記事番号25284へのコメント
クーパーさん
>日時型の扱いが苦手なんです。

多分原因は、日時値の日付で絞り込もうとしてもうまくしぼり込めないという理由と違いますか?

日時値は、年月日の他に、時分秒の値も持っております。
単純に「#日時値」関数を使うと、現在の日付時刻の値が入力されます。
日までを表示している日付でも実際には秒までの値も入っているわけです。

このために、単純に年月日だけで絞り込もうとすると、うまく行かなかったりします。
これが苦手な原因かと思います。

●対策
現在日付を初期値式で入力する時には、
#日時日付(#日時値)
として下さい。これで時刻以下の値は0時0分0秒になり、同じ日付の日時値が同じ値になります。

既に日時値が入力されているデータで、時刻の値が不要な場合には、
上記の式で置換をして下さい。
これで苦手な部分が得意になるはずです。

またグループ化に際しては、日時値のどこまで(年、月、日、あるいは四半期など)をグループとするかの指定もでき、
大変に楽になります。
25293 よくよく最初の質問を読み返してみたら 佐田 守弘 2004/03/06-23:24
記事番号25291へのコメント
よくよく最初の質問を読み返してみたら、同じグループで最新日付のレコードを取り出すのが目的でした。
日付順(昇順)に整列してあれば、先頭行ではなくて最終行が最新日付ですね。

という事で、行集計で最新日付が取り出せました。

佐田守弘(KS-00119)
25298 Re:よくよく最初の質問を読み返してみたら うにん 2004/03/07-14:16
記事番号25293へのコメント

>よくよく最初の質問を読み返してみたら、同じグループで最新日付のレコードを
>取り出すのが目的でした。
>日付順(昇順)に整列してあれば、先頭行ではなくて最終行が最新日付ですね。

それもありますが、整列しなくても日付型なので最新=最大値です。

25316 宿題手付かずなんですが。 クーパー 2004/03/08-20:43
記事番号25292へのコメント
佐田さん、うにんさん、ありがとうございます。

>整列しなくても日付型なので最新=最大値です。
この発想は私にはたぶんなかったですね。
勉強になるなぁ。

>行集計か結合表でやるのが素直じゃないでしょうか。
行集計は割と使っているのですが、
質問の件を結合表で、となるとちょっと思いつきません。
時間が取れるようになったらいろいろ試してみたいと思います。

今回ご協力いただいた質問に限らず、
同じ手順をいつも、だれがやっても
間違いなく繰り返せるように、が最大のテーマだったりします。

結合表とか割とよさそうです。勉強します。
一応フォーム作ったりしてだれでも同じ答えが出せるよう
いろいろ工夫はしているのですが。
向上心はあるうちに大事にしたいと思います。

戻る