5

多数の結合を実行し、WHERE 句にいくつかの基準を持つクエリがあり、基本的に次のような結果になります。

| userId |       date |  otherData |
|--------+------------+------------|
|      1 | 2008-01-01 |  different |
|      1 | 2009-01-01 |       info |
|      1 | 2010-01-01 |        for |
|      2 | 2008-01-01 |       each |
|      3 | 2008-01-01 |        row |
|      3 | 2009-01-01 |       here |

したがって、本質的に各ユーザーには、過去に 1 つ以上の日付があり、未来には 0 つ以上の日付があります。

どういうわけか、データセットをユーザーごとに 1 行に減らし、最近渡された日付を持つ行のみを選択する必要があります。つまり、魔法GROUP BYHAVING句が追加された場合、上記の結果は次のようになります。

| userId |       date |  otherData |
|--------+------------+------------|
|      1 | 2009-01-01 |       info |
|      2 | 2008-01-01 |       each |
|      3 | 2009-01-01 |       here |
4

4 に答える 4

5

GROUP BY / HAVING を使用したくないと思います。ユーザーごとに正確に 1 行に関心があり、その行がテーブルにそのまま存在するためです。これには、GROUP BY / HAVING ではなく、WHERE 句が必要です。

私の提案は、WHERE 句に、日付がサブクエリの結果と等しくなければならないという条件を追加することです。そのサブクエリは次のようにする必要があります。

  1. 最大(日付)を選択してください
  2. 日付を NOW より小さい値に制限する WHERE 句を使用する
  3. UserID が外部クエリのユーザー ID と等しい WHERE 句を使用する

特定のユーザーが、最大「通過」日付でもある同じ日付の 2 つのエントリを持つことができるケースを防ぐには、DISTINCT も追加する必要があります。

それが役立つことを願っています。

于 2009-06-02T06:23:53.023 に答える
0

このような:

select a.userId, a.date, b.userId, b.otherData
from table1 as a 
left outer join table2 as b on a.userId = b.userId
where b.Id in (
    select top 1 Id from table2 as c where c.userId = a.userId)
于 2009-06-02T06:29:49.143 に答える
0
選択する
  ユーザーID、日付、その他のデータ
から
  あなたのテーブル t1
どこ
  日付 =
    (yourTable t2 から max(date) を選択
     ここで、t1.userID=t2.userID)
于 2009-06-02T06:30:51.997 に答える
0
select T.userid, T.date, T.otherdata 
from 
    T, 
    (select userid, max(date) max_date from T group by userid) GT
where 
    T.userid = GT.userid and T.date = GT.max_date

説明: 内部選択 - 各ユーザーの最大日付を持つレコードのみを izolate します。全体の選択 - アイゾレートされたレコードを元のテーブルと結合して、他のデータ フィールドを取得します。

ユーザーIDの最大日付は1つだけであると想定しました。それが正しい仮定かどうか教えてください。

于 2009-06-02T06:31:21.637 に答える