2017-12-14 7 views
3

リスト内で最も古い日付を見つけようとしていますが、それぞれの "人物"の最新のエントリだけを考えたいと思います。最新の訪問の中で最も古いものを見つける。 (最小値は最大でグループ化されています)

I.e.次のデータセットを考える(日付はvarchar型です103つまりDD/MM/YYYY)

私は "ショップ"(ショップBYすなわちMIN(DATE)GROUP)のそれぞれについて、最小日付の使用状況を検索したい場合

+--------+------+------------+ 
| Person | Shop | Date  | 
+--------+------+------------+ 
| A  | X | 09/01/2017 | 
+--------+------+------------+ 
| A  | X | 12/01/2017 | 
+--------+------+------------+ 
| A  | Y | 12/01/2017 | 
+--------+------+------------+ 
| B  | X | 01/01/2017 | 
+--------+------+------------+ 
| B  | X | 13/01/2017 | 
+--------+------+------------+ 
| B  | Y | 11/01/2017 | 
+--------+------+------------+ 
| C  | X | 14/01/2017 | 
+--------+------+------------+ 
| C  | Y | 18/01/2017 | 
+--------+------+------------+ 
| C  | Y | 07/01/2017 | 
+--------+------+------------+ 
、それから、私はXショップが01/01/2017、Yが07/01/2017になります。しかし、これらの訪問の両方で、訪問した人が後で店に来たので、私は考慮したくありませんこれらの日付は「最も古い最も最近の」訪問の一部としてのものです。

明らかに、各顧客の最新の訪問のうち、最も古いものを知りたいと思います。すなわち、誰かが店を訪れたがその後戻ってこなかった最後の日付がいつだったかを示す。

ShopでMAX(日付)グループを抽出するテンポラリテーブルを経由する必要がありますか、またはYの12/01/2017とYのストレートのための日付を取得する方法がありますかこのデータセットから?

私は次のような結果が

+------+------------+ 
| Shop | Date  | 
+------+------------+ 
| X | 12/01/2017 | 
+------+------------+ 
| Y | 11/01/2017 | 
+------+------------+ 

すべてのヘルプは大幅に

+1

あなたは、明確化のために期待される結果セットをしてください追加することができます。 –

+0

あなたは最も古い訪問を望んでいますが、一度しか訪れなかった人からのものですか? – GuidoG

+2

あなたは本当に日付のデータ型に日付を格納し始めるべきです。それがそのために設計されたものです。どれくらいの人がこれが大丈夫だと思うか、私は引き続きショックを受けます。これらの人々は、整数をvarcharカラムに格納しません。 –

答えて

4

また、選択内の選択を試すことができます。

CREATE TABLE #VISIT (Person CHAR(1), Shop CHAR(1), [Date] DATE) 

INSERT INTO #VISIT 
SELECT 'A','X','09/01/2017' 
UNION ALL SELECT 'A','X','01/12/2017' 
UNION ALL SELECT 'A','Y','01/12/2017' 
UNION ALL SELECT 'B','X','01/01/2017' 
UNION ALL SELECT 'B','X','01/13/2017' 
UNION ALL SELECT 'B','Y','01/11/2017' 
UNION ALL SELECT 'C','X','01/14/2017' 
UNION ALL SELECT 'C','Y','01/18/2017' 
UNION ALL SELECT 'C','Y','01/07/2017' 

SELECT minDate.Shop 
    ,Min(minDate.lastVisit) 
FROM (
    SELECT Person 
     ,Shop 
     ,Max([Date]) lastVisit 
    FROM #VISIT 
    GROUP BY Person 
     ,Shop 
    ) AS minDate 
GROUP BY minDate.Shop 
+0

あなたは3分早くでした! –

+0

これは完璧です - ありがとうございました! – ACrazyChemist

4

最も簡単な方法は、ランキング機能ROW_NUMBER使用されていただければ幸いたいと思います:あなたが保存していないのはなぜ

with cte as 
(
    select Person, Shop, [Date], 
      rn = ROW_NUMBER() OVER (PARTITION BY Person Order By CONVERT(datetime, t.[Date], 103) DESC) 
    fromk dbo.TableName t 
) 
select Person, Shop, [Date] 
from cte 
where rn = 1 

date/datetimeとして、ただし、varcharとしますか?

+0

私はこのクエリが期待した結果を返すとは思わない。営業担当者は、1店舗あたりの最新の日付を取得したいと考えています。そして、最も早い1ショップあたりの価値を得てください。 –

+0

@GiorgosBetsos:たぶん私は質問を十分に慎重に読んでいないかもしれません。しかし、彼は「可能性のある人それぞれのために最も最近のエントリーを望んでいる」と述べた。しかし、彼は簡単にそれを修正することができます: 'パーソンバイセール、ショップ...' –

関連する問題