お世話になります。

現在、最新レコードを抽出し外部結合するSQLを考えているのですが、実現できておりません。
実現できるSQLをご存知の方、いらっしゃいましたら情報を頂けますでしょうか。
# 私の使用しているのは、PostgreSQL8.3となります。

実現したい内容は、以下となります。
 1.テーブルAから「名前」でグループ化して最新の「更新日付」のレコードを抽出。
 2.1の結果とテーブルBを「名前」で結合。
 3.テーブルAの「名前」、「点数」、「更新日付」とテーブルBの「判定」を抽出。
   ⇒ただしテーブルAに情報がある場合は、テーブルBの判定結果を「0」にして出力。


     テーブルA               テーブルB
----------------------------   -----------------------
 名前| 点数| 更新日付       名前 | 判定 
----------------------------   -----------------------
AAA   98   2011/4/1        AAA   0 
AAA   60   2011/4/3        BBB   1 
BBB   70   2011/4/2        CCC   1 
BBB   35   2011/4/4        DDD   1 
DDD   98   2011/4/1        EEE   0 
EEE   47   2011/4/5         FFF   0 
GGG   80   2011/4/6        GGG   1 

 
【出力結果】
---------------------------------------------
 名前 | 点数  | 更新日付 | 判定 
---------------------------------------------
AAA    60     2011/4/3      0 
BBB    35     2011/4/4     0(1⇒0に変更) 
CCC   NULL     NULL       1 
DDD    98     2011/4/1     0(1⇒0に変更) 
EEE    47     2011/4/5      0 
FFF    NULL     NULL       0 
GGG    80     2011/4/6     0(1⇒0に変更)

お手数お掛け致しますが、ご教示のほどよろしくお願い致します。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

PostgreSQL 8.3 ですと、「最新の「更新日付」のレコードを抽出」の箇所でセルフジョインが必要になります。



具体的なSQLはこのような感じです。最新の日付を max() で計算しているので、更新日付のデータ型を date にするか、文字列の場合はゼロ埋め ("2011/04/03") しておいてください。

CREATE TABLE テーブルA (名前 text, 点数 integer, 更新日付 date);
INSERT INTO テーブルA VALUES
('AAA', 98, '2011/4/1'),
('AAA', 60, '2011/4/3'),
('BBB', 70, '2011/4/2'),
('BBB', 35, '2011/4/4'),
('DDD', 98, '2011/4/1'),
('EEE', 47, '2011/4/5'),
('GGG', 80, '2011/4/6');

CREATE TABLE テーブルB (名前 text, 判定 integer);
INSERT INTO テーブルB VALUES
('AAA', 0),
('BBB', 1),
('CCC', 1),
('BBB', 1),
('DDD', 0),
('EEE', 0),
('GGG', 1);

SELECT
名前, 点数, 更新日付,
CASE WHEN max_a.名前 IS NOT NULL THEN 0 ELSE 判定 END AS 判定
FROM
(SELECT 名前, max(更新日付) AS 更新日付 FROM テーブルA GROUP BY 名前) AS max_a
JOIN
テーブルA USING (名前, 更新日付)
RIGHT JOIN テーブルB USING (名前);
    • good
    • 0
この回答へのお礼

お礼が遅くなり申し訳ありません。

ご回答ありがとうございます。
頂いたSQLで実現できました。また、更新日付のデータ型についても了解致しました。

ご協力ありがとうございました。

お礼日時:2011/05/11 17:37

最新レコードを抽出するのにnot existsを使う方法もありますね。


そこの部分以外はgacky-79さんのSQLをそのまま使わせていただきました。

SELECT
名前, 点数, 更新日付,
CASE WHEN max_a.名前 IS NOT NULL THEN 0 ELSE 判定 END AS 判定
FROM
(SELECT * FROM テーブルA AS A1
WHERE NOT EXISTS(
SELECT * FROM テーブルA AS A2
WHERE A1.名前 = A2.名前 AND A1.更新日付 < A2.更新日付
)) AS テーブルA
RIGHT JOIN テーブルB USING (名前);
    • good
    • 0
この回答へのお礼

お礼が遅くなり申し訳ありません。

ご回答ありがとうございます。
not existsを使用しても実現可能なんですね。性能面も考えて
NO.1の方のとどちらを使用するか検討させて頂きます。

ご協力ありがとうございました。

お礼日時:2011/05/11 17:40

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QAMD製CPUの性能比較サイト

AMD製CPUの性能を数値で一覧で比較しやすいサイトはありますでしょうか?
INTELの比較サイトはあったのですが、AMDは見つかりません…。
おおまかな比較でもかまいません。

異なるCPUの性能は単純に比較できない事は分かっています。
ですが、性能を細かく正確に知りたいワケではなく、おおまかに位置付けを感覚的に把握したいので、強引にでも杓子定規でも何でも、性能を数値化してCPUの種類を超えて、ある程度過去から現在にかけてのCPU性能を比較しているサイトが好ましいです。
具体例として、このような比較表のサイトが望ましいです。

INTELのCPUの比較表のサイト
http://maximums.gatt.nobody.jp/cpu.html
GPUの性能比較
http://mizushima.ne.jp/topic/GPU-benchmark/index.php

今回はAMDの過去から現在にかけてのCPU性能を比較しているサイトを質問していますが、分かりやすいINTELとAMD製CPU比較サイトもありましたらよろしくお願いします。

AMD製CPUの性能を数値で一覧で比較しやすいサイトはありますでしょうか?
INTELの比較サイトはあったのですが、AMDは見つかりません…。
おおまかな比較でもかまいません。

異なるCPUの性能は単純に比較できない事は分かっています。
ですが、性能を細かく正確に知りたいワケではなく、おおまかに位置付けを感覚的に把握したいので、強引にでも杓子定規でも何でも、性能を数値化してCPUの種類を超えて、ある程度過去から現在にかけてのCPU性能を比較しているサイトが好ましいです。
具体例として、このよう...続きを読む

Aベストアンサー

>INTELのCPUの比較表のサイト
>http://maximums.gatt.nobody.jp/cpu.html
ここにAMDも載っているのですが、これではダメなのでしょうか。

Q2つのテーブルかを結合し、全てが重複しているレコードを削除させたい

PostgreSQLを使って、
2つのテーブルを作成しています。
A と B とします。
2つのテーブルはそれぞれ違う条件で、
作成されたものなのですが、項目は同じです。
(違う場合もあるかもしれませんが、今回はこれで)
2つのテーブルで全てが同じレコードがあれば、
削除し、1つのテーブルとして、作成させることは
可能なのでしょうか?
教えてください。できれば、例をあげて下さると
嬉しいです。
ご伝授お願いします。

Aベストアンサー

テーブルAにすべての項目でUNIQUE制限をつけて、テーブルBから、全レコードをAに対してINSERTするってのはダメですか?

INSERTしようとしたときに、重複するデータはUNIQUEキーではじかれる・・・ということで。

(想定で回答していますのでアイデアだおれかもしれません)

Q最新のCPUについて

デスクトップパソコンをVistaに合わせて新しく組み立てたいと思っています。
PCショップのサイトを見てみると何種類かの高性能CPUがありますが、
知識が乏しいためどれを選択すればよいのか分りません。

そこで皆さんにお尋ねしますが、
あなたならどの最新高性能CPUを選択しますか?

条件は
インテル製CPU  ( AMD製CPU不可 )
デスクトップPC用
最新高性能
マルチCPU
X64対応 
予算制限なし です。

また、そのCPUに適合した、おすすめマザーボードがあれば教えてください。

http://www.faith-go.co.jp/lists/itemlist_parts.asp?cid=00001&fl=3,1,5,2&hid=i
こちらのサイトも参考にしてください。

多数のご意見をお待ちしています。

Aベストアンサー

CPU
Core 2 Extreme Conroe LGA775 FSB1066 L=4MB
(Core2 Extreme X6800):\129,800


マザーボード
ASUS:Striker Extreme \47,800
http://www.asus.com/products.aspx?l1=3&l2=11&l3=397&model=1439&modelmenu=2

Q2つの条件を満たすのレコードのカラムを抽出する方法について

下記のテーブルがあったとします。

【t_tblテーブル】
―――――――――――――
|id1  |id2 |id3  |
―――――――――――――
|1   |1  |10   |
|1   |2  |12   |
|1   |3  |9   |
|1   |4  |8   |
|1   |5  |14   |
|2   |1  |14   |
|2   |2  |8   |
|2   |3  |9   |
|2   |4  |12   |
|2   |5  |10   |
|3   |1  |4   |
|3   |2  |2   |
|3   |3  |3   |
|3   |4  |5   |
|3   |5  |6   |
|4   |1  |6   |
|4   |2  |5   |
|4   |3  |3   |
|4   |4  |2   |
|4   |5  |4   |
―――――――――――――


このテーブルの特定のレコードを抽出する為に、
2つパラメータを渡すとします。

1. 12
2. 8


そして下記の条件を満たすレコードのid1を抽出したいと思います。

1. 「id3」 = 「12」 かつ 「id3」 = 「8」 を満たすid1
(※この時点で1と2がヒットします)
2. 条件1を満たした上で、「12」のid2 < 「8」のid2
(※この時点で1のみヒットします)


下記のSQLで条件1を満たせる事は確認しましたが、
条件2を満たす方法が分かりませんでしたので、
アドバイスいただける方がいらっしゃいましたら、
ご教示いただきたいと思います。

select id1
from t_tbl
group by id1
Having SUM(CASE WHEN id3=12 Then 1 Else 0 End)>0
And SUM(CASE WHEN id3=8 Then 1 Else 0 End)>0


使用バージョンは7.4.19です。
よろしくお願いします。

下記のテーブルがあったとします。

【t_tblテーブル】
―――――――――――――
|id1  |id2 |id3  |
―――――――――――――
|1   |1  |10   |
|1   |2  |12   |
|1   |3  |9   |
|1   |4  |8   |
|1   |5  |14   |
|2   |1  |14   |
|2   |2  |8   |
|2   |3  |9   |
|2   |4  |12   |
|2   |5  |10   |
|3   |1  |4   |
|3   |2  |2   |
|3   |3  |3   |
...続きを読む

Aベストアンサー

読みにくいですけどこれで求められるようです。
試したのは8.3.5 ですが、たぶん7.4でもいけるはず。

select tbl.id1 from
((select id1 as id,id2 as id2_0 from t_tbl where id3 = 12) as t12
left outer join
(select id1,id2 from t_tbl where id3 = 8) as t8
on (t12.id=t8.id1)) as tbl
where tbl.id2_0 < tbl.id2;

QパソコンのCPUを最新のものに変えようと思うのです

パソコンのCPUを最新のものに変えようと思うのですがウチのパソコンで使える最適なCPUはなんでしょうか教えてください

マザーボード  hewlett-packard 08b8h
メモリ      3GB
HDD       500GB
グラフィックカード   NVDIA Quadro FX 3450/4000 SDI
CPU        Intel Xeon CPU 3.80GHz
電源       500V

また、おすすめのCPUなどありましたら 教えてください

Aベストアンサー

XW6200ですね
当時のCPU Xeon3.8GHzが搭載されていますね CPUは2個付いていますか?
このパソコンはCPUが2個搭載出来ますよ 2個有る方が快適に動きます

メモリはPC-2 3200 ECC DDR-2 SDRAMが4GBまで搭載可能ですね

残念ですが メーカーのホームページを見るとCPUの交換は無理ですね(他に選べる早いCPUが無いです)
Windows7でも動くと思いますが メモリが上限4GBですから快適かは微妙です

私もXW8600を使っています CPU3.0GHz×2 メモリ8GB ハードディスク合計6個 グラフィックカード交換 Windows7 64bit等色々追加して快適に使っています
6年落ちぐらいの中古パソコンですが 多少の重い作業でも不満は無いですね

ワークステーションは丈夫ですから個人的には気に入っています 

xw6200 はHyper-Threadingはオフで出荷されます。BIOSまたはHP Hyper- Threading Management Utilityで簡単にオンに出来ます。
上記は試していますか?

XW6200ですね
当時のCPU Xeon3.8GHzが搭載されていますね CPUは2個付いていますか?
このパソコンはCPUが2個搭載出来ますよ 2個有る方が快適に動きます

メモリはPC-2 3200 ECC DDR-2 SDRAMが4GBまで搭載可能ですね

残念ですが メーカーのホームページを見るとCPUの交換は無理ですね(他に選べる早いCPUが無いです)
Windows7でも動くと思いますが メモリが上限4GBですから快適かは微妙です

私もXW8600を使っています CPU3.0GHz×2 メモリ8GB ハードディスク合計6個 グラフィックカード交換 Windows7 64b...続きを読む

Q抽出して結合の仕方を教えてください

現在、Postgresを使って簡単なシステムを作っていますがどうしても
わからないので質問させていただきます。

四つのてーぶるがあります。
 (1)名簿
   名前 | 部門
   aaa   1
   bbb   1
   ccc   2
 (2)部門表
   部門 | 部門名
    1   第1営業
    2   第2営業
 (3)商品表
   商品id | 商品名
    1    りんご
    2    ババナ
 (4)売上
   No | 名前 | 商品id | 日付
   1  aaa   1   2007/04/07
   2  ccc   1   2007/04/07
   3  aaa   1   2007/04/08
このようなとき以下の表を一度に作れますか。
第1営業でりんごを売ったかどうか、売った場合は最新日付を表示
したいのです。
具体的には
  名前 | 日付
  aaa   2007/04/08
  bbb
のようにです

よろしくお願いいたします

現在、Postgresを使って簡単なシステムを作っていますがどうしても
わからないので質問させていただきます。

四つのてーぶるがあります。
 (1)名簿
   名前 | 部門
   aaa   1
   bbb   1
   ccc   2
 (2)部門表
   部門 | 部門名
    1   第1営業
    2   第2営業
 (3)商品表
   商品id | 商品名
    1    りんご
    2    ババナ
 (4)売上
   No | 名前 | 商品id | 日付
   1  aaa   1   2007/04/07
...続きを読む

Aベストアンサー

ANo.2の回答は間違ってました無視してください。

bbbの部署名と商品名がnull表示されているのを見落としていました。

select um.名前,case when hi is not null then b.部署名 else null end,s.商品名,hi
from (select m.名前,m.部門,u.商品id,max(u.日付) as hi
    from (売上 as u) right outer join (名簿 as m) on (u.名前 = s.名前 and s.商品id = '1')
    where m.部門 = '1'
    group by m.名前,m.部門,u.商品id) as um
  left outer join 商品表 as s on (um.商品id = s.商品id)
  ,部門表 as b
where um.部門 = b.部門

ですかねぇ。
テスト環境が無いので実行していませんが、
サブクエリー(またはView)を使用することと、条件分岐の組込み関数を使えばよいかと。

ANo.2の回答は間違ってました無視してください。

bbbの部署名と商品名がnull表示されているのを見落としていました。

select um.名前,case when hi is not null then b.部署名 else null end,s.商品名,hi
from (select m.名前,m.部門,u.商品id,max(u.日付) as hi
    from (売上 as u) right outer join (名簿 as m) on (u.名前 = s.名前 and s.商品id = '1')
    where m.部門 = '1'
    group by m.名前,m.部門,u.商品id) as um
  left outer join 商品表 as s on (um.商品id = s.商...続きを読む

Qcpuの比較

最近はCPUがたくさんありますが、いまいち比較ができません。
インテルはクロック重視だし
AMDはIPC?(一サイクルに使うクロック?みたいな)重視なので、単純には比較できません。

そこで、もっと比較しやすい基準ってないんですか?
ベンチマークみたいな

そんなサイトがあれば、価格とパフォーマンスをみてcpu決められるんですが・・・

ちなみに同じことがグラフィックボードにもいえます。
nVIDIAとATIで比較できないし

Aベストアンサー

CPUの比較は色々なサイトで見つかりますよ。
例えば、これ↓
http://www.xbitlabs.com/articles/cpu/

ビデオカードならこれ↓とか。
http://www.xbitlabs.com/articles/video/

Q特定の値が入っているレコードを抽出する方法について

下記のテーブルがあったとして、
field2にグループAに該当する値と、グループBに該当する値が共に1つずつ入っている
field1の値を抽出したいと思いました。
下記の場合ですと、その条件を満たす1, 3, 4, 6を抽出したいと思います。

グループA:1, 2, 3
グループB:101, 102, 103

―――――――――
|field1|field2
―――――――――
|1   |1  
|1   |10
|1   |101
|2   |1  
|2   |15
|2   |104
|3   |2  
|3   |18
|3   |101
|4   |2  
|4   |17
|4   |103
|5   |3  
|5   |15
|5   |100
|6   |3  
|6   |18
|6   |103
―――――――――

使用バージョンは7.4.19です。
よろしくお願いします。

Aベストアンサー

以下は一例です。

SELECT field1 FROM T
GROUP BY field1
HAVING MAX((CASE WHEN field2 in (1,2,3) THEN 1 ELSE 0 END)
|(CASE WHEN field2 in (101,102,103) THEN 2 ELSE 0 END))=3

その他、サブクエリでAグループ、Bグループを作り、INNER JOINする
方法などが考えられます。

QCPUの性能比較サイトを教えて欲しい

Core2DuoとPenDとPen4とCeleronDの性能比較したグラフを以前どこかのサイトで見たのですが知っている方、おられませんでしょうか?
いくら探しても見つかりません。
また4種類のCPU比較ではなくても良いので、CPUのベンチマークなどの性能比較しているサイトがあれば教えてください。

Aベストアンサー

Tom's Hardware Guide Processors: CPU Charts 2006
http://www23.tomshardware.com/cpu.html?modelx=33&model1=430&model2=464&chart=173
他にもPCマーク、オフィスのベンチもあります
http://www.dosv.jp/feature/0610/05.htm

Qpostgres 外部結合(AからB、BからC)

postgresの外部結合で質問です。

テーブルを複数外部結合する場合、
A(左)B(右)、
A(左) C(右)と外部結合する場合のSQLはよく載っているのですが
A(左)B(右)で外部結合、
そしてさらに
B(左)C(右)の外部結合のSQL例がなかなか載っておらず、見つけれません。
どなたか教えてください。

Aベストアンサー

じゃぁ
SELECT a.*, b.*, c.* FROM a LEFT JOIN b ON a.key = b.key LEFT JOIN c ON b.key2 = c.key2;

でいいんじゃ


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報