9

各証券の最新のポジションを取得しようとしているテーブルがあります。

テーブル:

テーブルを作成するための私のクエリ:SELECT id, security, buy_date FROM positions WHERE client_id = 4

+-------+----------+------------+
| id    | security | buy_date   |
+-------+----------+------------+
|    26 | PCS      | 2012-02-08 |
|    27 | PCS      | 2013-01-19 |
|    28 | RDN      | 2012-04-17 |
|    29 | RDN      | 2012-05-19 |
|    30 | RDN      | 2012-08-18 |
|    31 | RDN      | 2012-09-19 |
|    32 | HK       | 2012-09-25 |
|    33 | HK       | 2012-11-13 |
|    34 | HK       | 2013-01-19 |
|    35 | SGI      | 2013-01-17 |
|    36 | SGI      | 2013-02-16 |
| 18084 | KERX     | 2013-02-20 |
| 18249 | KERX     | 0000-00-00 |
+-------+----------+------------+

このページに基づいてクエリのバージョンをいじっていますが、探している結果が得られないようです。

これが私が試してきたことです:

SELECT t1.id, t1.security, t1.buy_date 
FROM positions t1
WHERE buy_date = (SELECT MAX(t2.buy_date)
                    FROM positions t2
                    WHERE t1.security = t2.security)

しかし、これは私を返します:

+-------+----------+------------+
| id    | security | buy_date   |
+-------+----------+------------+
|    27 | PCS      | 2013-01-19 |
+-------+----------+------------+

各証券の最大/最新の購入日を取得しようとしているため、結果には証券ごとに最新の購入日が 1 行含まれます。どんな助けでも大歓迎です。

編集: ポジションの ID は、最大購入日と共に返される必要があります。

4

5 に答える 5

9

サブクエリを使用して結果を取得できます。

SELECT p1.id, 
  p1.security, 
  p1.buy_date 
FROM positions p1
inner join
(
  SELECT MAX(buy_date) MaxDate, security
  FROM positions 
  group by security
) p2
  on p1.buy_date = p2.MaxDate
  and p1.security = p2.security

デモで SQL Fiddle を参照してください

WHEREまたは、句で次を使用できます。

SELECT t1.id, t1.security, t1.buy_date 
FROM positions t1
WHERE buy_date = (SELECT MAX(t2.buy_date)
                  FROM positions t2
                  WHERE t1.security = t2.security
                  group by t2.security)

デモで SQL Fiddle を参照してください

于 2013-03-04T21:39:04.413 に答える
5

これは単純な group by で行われます。証券ごとにグループ化し、buy_date の最大値を取得します。SQL:

SELECT security, max(buy_date) 
from positions
group by security

これはbluefeet の回答よりも高速ですが、ID は表示されないことに注意してください。

于 2013-03-04T21:31:39.680 に答える
3

@bluefeet による回答には、必要な結果を得る方法がさらに 2 つあり、最初の方法はおそらくクエリよりも効率的です。

私が理解できないのは、クエリが機能しないとあなたが言う理由です。かなり問題ないようで、期待される結果を返します。SQL-Fiddleでテスト済み

SELECT t1.id, t1.security, t1.buy_date 
FROM positions t1
WHERE buy_date = ( SELECT MAX(t2.buy_date)
                   FROM positions t2
                   WHERE t1.security = t2.security ) ;

条件を追加するときに問題が発生する場合は、両方の句に追加する必要があるのに、一方の句client_id = 4にのみ追加するためです。WHERE

SELECT t1.id, t1.security, t1.buy_date 
FROM positions t1
WHERE client_id = 4
  AND buy_date = ( SELECT MAX(t2.buy_date)
                   FROM positions t2
                   WHERE client_id = 4
                     AND t1.security = t2.security ) ;
于 2013-03-04T23:51:34.547 に答える
1
select security, max(buy_date) group by security from positions;

各証券の最大購入日を取得するために必要なのはこれだけです (クエリから何を求めているかを大声で言い、「for each x」というフレーズを含める場合、おそらく x でグループ化する必要があります)。

を使用する場合group by、select 内のすべての列は、グループ化された列または集計である必要があるため、たとえば、id を含めたい場合は、以前と同様のサブクエリを使用する必要があります。 IDで合理的に使用できる集計がないように思われるため、別のグループ化では行が多すぎます。

于 2013-03-04T21:29:53.033 に答える