2

「グループ化」によってテーブルから行を選択しようとしていますが、データを日付で並べ替えて得られた最初の行を無視しています。グループの最新のエントリを無視して古いエントリを返すには、日付フィールドで並べ替えを行う必要があります。

テーブルは次のようになります

+----+------------+-------------+-----------+
| id | updated on | group_name  | list_name |
+----+------------+----------------+--------+
| 1  | 2013-04-03 | g1          | l1        |
| 2  | 2013-03-21 | g2          | l1        |
| 3  | 2013-02-26 | g2          | l1        |
| 4  | 2013-02-21 | g1          | l1        |
| 5  | 2013-02-20 | g1          | l1        |
| 6  | 2013-01-09 | g2          | l2        |
| 7  | 2013-01-10 | g2          | l2        |
| 8  | 2012-12-11 | g1          | l1        |
+----+------------+-------------+-----------+

http://www.sqlfiddle.com/#!2/cec99/1

したがって、基本的には、group_name と list_name で最も古い ID (3,4,5,6,8) を返したいだけです。group_name と list_name に基づいてグループ化することにより、最新のエントリを無視して古いエントリを返す

この問題の sql を書くことができません。order by は group by では機能しないことを知っています。解決策を見つけるのを手伝ってください。

ありがとう

また、サブクエリを使用せずにこれを行う方法はありますか?

4

3 に答える 3

2

特定の行の最小日付である行のみを取得するには、次のようにします。

select a.ID, a.updated_on, a.group_name, list_name
from data a 
where
a.updated_on < 
(
select max(updated_on)
from data 
group by group_name having group_name = a.group_name
);

SQL フィドル: http://www.sqlfiddle.com/#!2/00d43/10

更新 (要件に基づく)

select a.ID, a.updated_on, a.group_name, list_name
from data a 
where
a.updated_on < 
(
select max(updated_on)
from data 
group by group_name, list_name having group_name = a.group_name
  and list_name = a.list_name
);

参照: http://www.sqlfiddle.com/#!2/cec99/3

更新(相関サブクエリを使用せず、単純なサブクエリを使用するには)

以下に基づいて、相関サブクエリが遅すぎると判断されました:サブクエリと結合

そのため、ネストされたクエリに基づいて、エイリアス化された一時テーブルと結合するように変更しました。

select a.ID, a.updated_on, a.group_name, a.list_name
from data a,
(
select group_name, list_name , max(updated_on) as MAX_DATE
from data 
group by group_name, list_name 
) as MAXDATE   
where
a.list_name = MAXDATE.list_name AND
a.group_name = MAXDATE.group_name AND
a.updated_on < MAXDATE.MAX_DATE
;

SQL フィドル: http://www.sqlfiddle.com/#!2/5df64/8

于 2013-05-30T13:05:13.780 に答える
0

次のクエリを使用してみてください (はい、ネストされた結合がありますが、役立つ場合があります)。

SELECT ID FROM 
(select d1.ID FROM data d1 LEFT JOIN 
data d2 ON (d1.group_name = d2.group_name AND d1.list_name=d2.list_name AND 
d1.updated_on > d2.updated_on) WHERE d2.ID IS NULL) data_tmp;

修正:

SELECT DISTINCT(ID) FROM 
(select d1.* FROM data d1 LEFT JOIN 
data d2 ON (d1.group_name = d2.group_name AND d1.list_name=d2.list_name AND 
d1.updated_on < d2.updated_on) WHERE d2.ID IS NOT NULL) date_tmp;
于 2013-05-30T13:23:57.677 に答える
0
SELECT DISTINCT y.id 
  FROM data x 
  JOIN data y 
    ON y.group_name = x.group_name 
   AND y.list_name = x.list_name 
   AND y.updated_on < x.updated_on;
于 2013-06-04T21:12:49.580 に答える