ママのスキンケアのお悩みにおすすめアイテム

非常に初歩的な事で恐縮ですが、
以下のデータを抽出するsql文の書き方を模索しています。
環境:SQLSERVER2005

| 列1| 列2 |
+---+---+
| 1 | A |
| 1 | B |
| 1 | C |
| 1 | D |
| 2 | F |
| 2 | G |
| 2 | H |
| 3 | X |
| 3 | Y |
| 3 | Z |

上記のテーブルがあるとします。
列1でグループした値で、1レコード目の列2を抽出したいのです。
出力結果としては、

列1列2
+--+--+
1,A
2,F
C,X

としたいのです。
列1でGROUPしてしまうと列2の内容を集約しないといけないので困っています。
ご教授いたけないでしょうか?

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

A 回答 (3件)

SQL Server 2005では、Oracleでいう分析関数が実装されています。



select
列名1,
列名2
from
(select
rank() over(partition by 列1 order by 列2) as rk,
列1,列2
from 表名) as x
where rk=1
    • good
    • 11
この回答へのお礼

chukenkenkouさん
アドバイス有難う御座いました。
お返事が遅くなり申し訳ありませんでした。

まさにこれです。
partitionと言う関数があったのですね。
有難う御座いました。

お礼日時:2008/02/29 20:16

#本題と関係ありませんが・・



いや、「1アイテム目」が「必ず昇順に返ってくる」とか「登録順に返ってくる」とか「物理的な配置順に返ってくる」という保証は、いかなるデータベースでもあり得ません。orderを指定しなければ「順不同(になることもある)」がデータベースです。SQLServerも例外ではありません。
    • good
    • 1
この回答へのお礼

アドバイスありがとうございます。
もちろん、先頭抽出条件においてはorder等のデータ整列調整は行います。

有難う御座いました。

お礼日時:2008/02/29 14:36

列2の「1レコード目」というのがどういう意味かわかりませんが(データベースではorderがない状態で1レコード目という概念はあり得ないので)「最小のもの」でよければ



 select 列1, min(列2) as 列2_min from テーブル group by 列1

でいいと思います。
    • good
    • 0
この回答へのお礼

shimixさん
回答ありがとうございました。

1レコード目と言うのはおかしな表現でした。
失礼致しました。
1アイテム目と言う事で有ってますでしょうか。

>select 列1, min(列2) as 列2_min from テーブル group by 列1
なるほど、値を大小区別できるように抽出しておいてやれば、取得出来ますね。また、別の列にROW_NUMBERを切ってやれば大小関係なく抽出できそうです。
有難う御座いました。

お礼日時:2008/02/29 13:06

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

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

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

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

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

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

QSELECTで1件のみ取得するには?

こんにちわ。
いまORACLE9iを使用している者です。

ACCESSでは
SELECT TOP 1 項目名 FROM テーブル名
ORDER BY 項目名;
で並べ替えたデータ群のうち,先頭の1件だけを
取ることができますが,
ORACLEでそのような機能(SQL)はあるでしょうか?
教えてください。
よろしくお願いします。

Aベストアンサー

order by と rownum を併用する場合は注意が必要です。

[tbl01]
cola | colb
------------
1000 | aaaa
1001 | bbbb

というデータがある場合、
select cola from tbl01 where rownum < 1 order by cola desc;
とすると、「1001」ではなく、「1000」が返されます。
これは、order by の前に rownum < 1 が適用されてしまうからです。

解決するには、
select aaa from (select cola aaa from tbl01 order by cola desc) where rownum = 1;
とすれば良いです。

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分

Q[SQL]重複内容を持つデータから1件抽出かつ複数のカラムを表示したい

[SQL]重複内容を持つデータから1件抽出かつ複数のカラムを表示したい

初めてお世話になります。

データベース種別はH2です。
参考:http://www.h2database.com/html/main.html

下記のようなテーブルAがあるとします。

  ID  |  TAG  |
―――――+―――――|
  1   |  abc   |
  1   |  def   |
  1   |  ghi   |
  2   |  abc   |
  2   |  ghi   |
  3   |  abc   |
  3   |  def   |
  3   |  ghi   |
  4   |  abc   |


上記テーブルAから下記例のような結果を得られるSQLを知りたいのです。

  ID  |  TAG  |
―――――+―――――|
  1   |  abc   |
  2   |  abc   |
  3   |  abc   |
  4   |  abc   |

上記結果でなくとも、


  ID  |  TAG  |
―――――+―――――|
  1   |  def   |
  2   |  ghi   |
  3   |  def   |
  4   |  abc   |

であっても構いません。(TAG列のデータはどんな内容でもよいです。)

実現させたいのは、
(1)ID列が重複しない結果を表示させたい、
かつ
(2)TAG列も表示させたい
ということです。

これでイケるだろ!と思ってあえなく失敗したSQLは下記です;
select distinct(ID), TAG from A


宜しくお願い致します。

[SQL]重複内容を持つデータから1件抽出かつ複数のカラムを表示したい

初めてお世話になります。

データベース種別はH2です。
参考:http://www.h2database.com/html/main.html

下記のようなテーブルAがあるとします。

  ID  |  TAG  |
―――――+―――――|
  1   |  abc   |
  1   |  def   |
  1   |  ghi   |
  2   |  abc   |
  2   |  ghi   |
  3   |  abc   |
  3   |  def   |
  3   |  ghi   |
  4   |  abc   |


上記テーブルAか...続きを読む

Aベストアンサー

H2を知らないケド。Oracleだったら。

select ID, MIN(TAG) from A
GROUP BY ID
ORDER BY ID

ではどうでしょう?


select ID, MAX(TAG) from A
GROUP BY ID
ORDER BY ID
もお試しください。

Q各伝票に対して明細を1行目だけ表示したい

たびたびお世話になります。

仮に以下のようなテーブルを考えるとします。

○テーブルA (伝票)
伝票番号 (PK)
顧客コード

○テーブルB (伝票明細)
伝票番号 (PK)
伝票明細 (PK)
注文コード
大盛り区分

レストランなどでお客さんが注文した注文伝票を
想像していただければ良いかと思います。
一つの伝票番号に対して、複数の伝票明細があると。
DB上は上記のように格納するとします。

ここでテーブル結合を使って、各伝票の1行目の明細を表示しながら
SQL1発で抜いてきたいと思います。どういうSQLを考えたら良いでしょうか?

テーブルBの表示項目が1つだけなら、

SELECT A.伝票番号, A.顧客コード, (SELECT TOP 1 注文コード FROM テーブルB B WHERE A.伝票番号 = B.伝票番号)
FROM テーブルA A

で良いのですが、複数項目となるとどうやったら良いのか判りません。

Aベストアンサー

 テーブルBの1行目レコードというのを、どう定義するかによって、答えが変わると思います。
 
例えば、テーブルBの伝票明細が1から順にふられる数字であって、その伝票明細=1のものだけ取ってくれば良いというのであれば、SQL文はいたってシンプルになるかと思います。
 
 SELECT A.伝票番号,A.顧客コード,B.伝票明細,B.注文コード,B.大盛り区分
FROM テーブルA AS A
INNER JOIN テーブルB AS B
ON A.伝票番号=B.伝票番号
AND B.伝票明細=1

こんな感じでしょうか。

 伝票明細が1から始まらず、「TOP 1」を使うというのであれば

 SELECT A.伝票番号,A.顧客コード,B.伝票明細,B.注文コード,B.大盛り区分
FROM テーブルA AS A
INNER JOIN テーブルB AS B
ON A.伝票番号=B.伝票番号
WHERE B.伝票明細=(SELECT TOP 1 C.伝票明細 FROM テーブルB AS C WHERE B.伝票番号=C.伝票番号)

こんな感じになります。この場合EXIST使ったりIN使ったり、細かい事を言えば色々方法はあるかと思います。でも基本的な考えは同じようなものです。

 

 テーブルBの1行目レコードというのを、どう定義するかによって、答えが変わると思います。
 
例えば、テーブルBの伝票明細が1から順にふられる数字であって、その伝票明細=1のものだけ取ってくれば良いというのであれば、SQL文はいたってシンプルになるかと思います。
 
 SELECT A.伝票番号,A.顧客コード,B.伝票明細,B.注文コード,B.大盛り区分
FROM テーブルA AS A
INNER JOIN テーブルB AS B
ON A.伝票番号=B.伝票番号
AND B.伝票明細=1

こんな感じでしょうか。

 伝票明細が1か...続きを読む

Qsqlserverにはグループ集計のfirstとlastがありません??

accessユーザーです
sqlserverに組み替えているなかでaccessでは今までグループ集計をクエリーで作成していました
select first(フィールド1) as AA,last(フィールド2) as BB  from FFテーブル group by フィールド3
ところがsqlserverにはfirstとlastがありません??
どのようにすればよいのかご教授おねがいします
firstとlastはない場合、ほかの方法で結果がでればどの方法でもかまいません。
よろしくおねがいします

Aベストアンサー

http://www.microsoft.com/japan/technet/prodtechnol/sql/70/deploy/access.mspx#EBGAC
こちらの情報によると、SQLServerにはfirst、lastはありません。

また、一般的にデータベースでは登録したデータの順番は記録しません。

例えば、Order Byで並び順を指定せず、SELECT文でレコードを選択した場合、
その並び順は不定になります。
(仮に登録順で表示されたとしても、それは保障されていません。)

登録順で並べたり、最後に登録したデータを取り出す等は出来ません。

登録順での操作が必要な場合、フィールドを追加し、
オートナンバー等で何らかの記録を残しておく必要があります。

言ってしまえば、Accessのfirstとlastが特殊なんです。
Access以外では使えないと思って頂いてよいと思います。

こちらの情報なども、参考にどうぞ
http://blackbird.cocolog-nifty.com/progtalk/2004/11/sqllast.html
http://support.microsoft.com/default.aspx?scid=kb;ja;208190


>firstとlastはない場合、ほかの方法で結果がでればどの方法でもかまいません。

オートナンバーのフィールドを追加し、IDとします。

------------------------
SELECT F1.フィールド1, L2.フィールド2, F1.フィールド3
FROM
(

SELECT X.フィールド1, X.フィールド3
FROM FFテーブル AS X INNER JOIN
(
SELECT Min(F.ID) AS FirstID, F.フィールド3
FROM FFテーブル AS F
GROUP BY F.フィールド3
) AS F
ON F.FirstID = X.ID

) AS F1

INNER JOIN

(

SELECT X.フィールド2, X.フィールド3
FROM FFテーブル AS X INNER JOIN
(
SELECT Max(L.ID) AS LastID, L.フィールド3
FROM FFテーブル AS L
GROUP BY L.フィールド3
) AS L
ON L.LastID = X.ID

) AS L2

ON F1.フィールド3 = L2.フィールド3;
------------------------

長いですが、1つのSQL文です。(^^;
これで期待どうりの結果になってるでしょうか?

(Accessで動作確認しましたが、SQLServerでは確認してません。)

http://www.microsoft.com/japan/technet/prodtechnol/sql/70/deploy/access.mspx#EBGAC
こちらの情報によると、SQLServerにはfirst、lastはありません。

また、一般的にデータベースでは登録したデータの順番は記録しません。

例えば、Order Byで並び順を指定せず、SELECT文でレコードを選択した場合、
その並び順は不定になります。
(仮に登録順で表示されたとしても、それは保障されていません。)

登録順で並べたり、最後に登録したデータを取り出す等は出来ません。

登録順での操作が必要な...続きを読む

QSQLで特定の項目の重複のみを排除した全項目を取得する方法

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のような構造になっている場合に「項目名1」について重複している項目を排除し、結果として


項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 B    え    イ    江

上のようなデータを取得したいのです。
この時に、Aの重複を排除して取得するレコードは1~3行目のどれでもよいです。
また、データを取得する際には必ずそのレコードの「全項目」を取得したいのでDistinctはうまく使えませんでした。

どなたか詳しい方、方法を教えてくださると幸いです。回答お待ちしております。

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のよ...続きを読む

Aベストアンサー

比較可能で一意性のある値をもてる項目6をテーブルに追加して、

select T.* from T, (select Item1,min(Item6) as Item6 from T group by item1) W where T.item6=W.item6;

――ってやるのが、一番手っ取り早いと思います。
他のところに影響がでないのであればですが。
oracleならrowidを使うとか、レコードの更新時刻を突っ込むとか。

Q2つのテーブルから条件に一致しないデータ抽出

2つのテーブルから条件に一致しない行のみ抜き出しCSV
か他のテーブルに抜き出す処理を作ろうと思っています。

そこで質問なのですが、以下の2つのテーブルから
条件に一致しないコードのみ抜き出すSQL文などありますか?

-----------------------------------------
マスターテーブル
コード、ネーム1、ネーム2、店コード
1、あ、い、6
2、う、え、8
3、お、か、4
4、き、く、2


店コードテーブル
店コード、店区分
1、スーパー
2、コンビニ
3、デパート
4、ホームセンター
------------------------------------------

条件は、マスターテーブルの店コードが店コードテーブルに存在
しないデータのみ抽出です。

抽出結果は、以下の様にしたいです。
1、あ、い、6
2、う、え、8

このような考え大丈夫でしょうか?
SELECT *
FROM マスターテーブル AS M INNER JOIN 店コードテーブル AS S
ON M.店コード = S.店コード

わかりずらい質問ですがよろしくお願いします。

2つのテーブルから条件に一致しない行のみ抜き出しCSV
か他のテーブルに抜き出す処理を作ろうと思っています。

そこで質問なのですが、以下の2つのテーブルから
条件に一致しないコードのみ抜き出すSQL文などありますか?

-----------------------------------------
マスターテーブル
コード、ネーム1、ネーム2、店コード
1、あ、い、6
2、う、え、8
3、お、か、4
4、き、く、2


店コードテーブル
店コード、店区分
1、スーパー
2、コンビニ
3、デパート
4、ホームセンタ...続きを読む

Aベストアンサー

このような考え大丈夫でしょうか?
SELECT *
FROM マスターテーブル AS M INNER JOIN 店コードテーブル AS S
ON M.店コード = S.店コード

店コードが一致するレコードを抽出しているのですね。
はい、大丈夫です。
もっとも単純に、分かりやすい式を書くのであれば

この条件否定なので
left outer join で結合して、結合できなかったデータ、
つまり、店がNullのデータを取れば抽出できます。

SELECT *
FROM マスターテーブル AS M left outer join 店コードテーブル AS S
ON M.店コード = S.店コード
where S.店コード is null

または、
SELECT *
FROM マスターテーブル as M
where M.店コード not in ( select 店コード from 店コードテーブル)

等でいけるでしょう。

ただ、参考URLにもありますように、
is null とか not in は遅いです。(Indexで見れなくなるので)
大量データを扱うような場合や、速度が求められるような場合は
別途クエリを検討しましょう。

参考URL:http://www.geocities.jp/mickindex/database/db_optimize.html

このような考え大丈夫でしょうか?
SELECT *
FROM マスターテーブル AS M INNER JOIN 店コードテーブル AS S
ON M.店コード = S.店コード

店コードが一致するレコードを抽出しているのですね。
はい、大丈夫です。
もっとも単純に、分かりやすい式を書くのであれば

この条件否定なので
left outer join で結合して、結合できなかったデータ、
つまり、店がNullのデータを取れば抽出できます。

SELECT *
FROM マスターテーブル AS M left outer join 店コードテーブル AS S
ON M.店コード = S....続きを読む

Q3つの表の外部結合

表A、B、Cの3つがあり、Aのすべての行を出力したいと考えています。
外部結合を用いるのだとは思うのですが、3つの表に対して行う場合の
書き方がわからず困っています。
ご教授いただけないでしょうか?
select * from a,b,c
where a.商品ID =b.商品ID (+) and b.商品ID (+) =c.商品ID (+)
としてみましたが、うまくいきませんでした。

Aベストアンサー

ansi構文の趣旨からいえば、結合条件と絞り込み条件は分けて書くので・・

select *
from a
left join b on (a.商品ID =b.商品ID)
left join c on (b.商品ID =c.商品ID)
where a.年月 = 任意の値

と書くのが一般的でしょうね。

Qgroup byで最後のレコードを抽出したい

group byで特定のカラムをまとめる際に、最後(最新)のレコードを抽出したいのですが
最初(古い)の行が抽出されてしまいます。

例えば、threadカラムとuptimeカラムがあるテーブルBBSで
threadカラムをgroup byでまとめる際にuptimeの降順(desc)でまとめたい場合
どのようにしたらいいでしょうか?

【テーブルBBS】

id thread uptime
1 1 1230100000
2 2 1230200000
3 1 1230300000
4 3 1230400000
5 1 1230500000
6 2 1230600000

select * form bbs group by thread order by uptime desc

だと

thread uptime
3 1230400000
1 1230300000
2 1230200000

になってしまいます。

次のような結果を表示するにはどのようにしたらいいでしょうか。

thread uptime
2 1230600000
1 1230500000
3 1230400000

また、DISTINCTを使うと同じフィールド内に重複したレコードがある場合は最初のレコードのみ表示されますが、最後のレコードのみ表示するにはどのようにすればいいのでしょうか?

よろしくお願い致します。

group byで特定のカラムをまとめる際に、最後(最新)のレコードを抽出したいのですが
最初(古い)の行が抽出されてしまいます。

例えば、threadカラムとuptimeカラムがあるテーブルBBSで
threadカラムをgroup byでまとめる際にuptimeの降順(desc)でまとめたい場合
どのようにしたらいいでしょうか?

【テーブルBBS】

id thread uptime
1 1 1230100000
2 2 1230200000
3 1 1230300000
4 3 1230400000
5 1 1230500000
6 2 123060000...続きを読む

Aベストアンサー

単にthread毎にまとめた最大のuptimeをとるだけですよね?
select thread,max(uptime) as uptime form bbs group by thread order by uptime desc

これにidの情報がほしいということだと、サブクエリが必要になります

QGROUP BYを行った後に結合したい。

oracle8iを使用しています。
2つのテーブルを結合したいと思っていますが、
テーブル構成が、N対Nのテーブルのため、
片方をグループ化したあとに結合させようと思っています。

ところが、単純にGroup byを使うと、結合した後に
グループ化してしまうために、期待した値がひょうじされません。

なんとか、1回のSQLで正しく情報をとることはできないものでしょうか。

Aベストアンサー

>テーブル構成が、N対Nのテーブルのため、
>片方をグループ化したあとに結合させようと思っています。

多分こんな形ではどうですか?

SELECT A.KEY,B.KEY,
FROM TABLE_A A
,(SELECT KEY FROM TABLE_B
GROUP BY KEY) B
WHERE A.KEY=B.KEY;

要はFROM句にテーブル名ではなく、SELECT~GROUP BYを書く。


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

人気Q&Aランキング