2

私はここで角を向いています...

背景:

TABLE myrecord (
 id     int         # primary key
 name   varchar(32) # test name
 d_when varchar(8)  # date in yyyymmdd string format
) 

コンテンツ:

id    name     d_when
100   Alan     20110201
101   Dave     20110304
102   Alan     20121123
103   Alan     20131001
104   Dave     20131002
105   Bob      20131004
106   Mike     20131101

簡単に言えば、誰が「再訪者」であり、彼が最後に (つまり、「最後から 2 番目に」) 訪問したのはいつかを把握したいのです。熱狂的すぎるようなもの:

SELECT SECOND_MAX(id), CORRESPONDING(d_when) 
FROM myrecord 
GROUP BY name 
HAVING count(name)>1;

予想される結果:

101   Dave     20110304 
102   Alan     20121123

これまでに次のことを試しました。

SELECT T1.id, t1.name, T1.d_when 
FROM myrecord t1 
WHERE id IN (SELECT MAX(id), 
    COUNT(id) cn 
    WHERE cn>1 
    ORDER BY d_when DESC)

しかし、ここでは明らかに何かが正しくありません。

4

5 に答える 5

3

これが1つの方法です...

SELECT x.* 
  FROM my_table x 
  JOIN my_table y 
    ON y.name=x.name 
   AND y.d_when >= x.d_when 
 GROUP 
    BY x.name 
     , x.d_when 
HAVING COUNT(*) = 2;
于 2013-07-06T08:47:17.433 に答える
2

MySQL では、2 回目の訪問を行ったすべての人とその 2 回目の訪問日を取得します。

クエリ:

SELECT *
FROM
(
SELECT
   @ID:=CASE WHEN @Name <> Name THEN 1 ELSE @ID+1 END AS rn,
   @Name:=Name AS Name,
   ID, d_when
FROM
  (SELECT ID, Name, d_when
   FROM myrecord
   ORDER BY Name asc, d_when asc
  ) rec1,   (SELECT @ID:= 0) rec1_id, (SELECT @Name:= 0) rec1_nm
) rec
where rec.rn=2

出力:

rn  Name    ID  d_when
2   Dave    104 20131002
2   Alan    102 20121123
于 2013-07-06T08:28:35.590 に答える
0
select * from 
myrecord
where id in (
    SELECT max(id)
    FROM myrecord 
    WHERE id not in (SELECT MAX(id)
        FROM myrecord   
        GROUP BY name 
        HAVING count(name)>1)
    group by name )
于 2013-07-06T07:45:21.447 に答える