2017-11-09 11 views
1

この質問は重複しているように聞こえるかもしれませんが、それはまだ私が逃したかもしれない質問の重複かもしれないが、まだある。2番目のテーブルの異なる値を使用するT-SQL結合クエリ

サーフェス値が些細な要件であるように見えますが、どのようにスクリプト化しても、ちょうど動作していない警告があります。私はGROUPDISTINCTJOIN、集約関数を、試してみたなど

シナリオ: PRIMARYTABLEはキャンペーンのセットが含まれており、SECONDARYTABLEは、キャンペーンが実行された日付が含まれています。キャンペーンごとに複数のランがあり、実行ごとにSUBKEYが含まれています。

要件: 最も頻繁に実行されるキャンペーンをリストにまとめて、最も頻繁に実行されるキャンペーンからより簡単に選択できるようにする必要があります。

PRIMARYTABLE 
KEYCOLUMN INFOCOLUMN 
100000  Test 1 
100001  Test Campaign 
100002  Test Image 2 
100003  Test Img 
100004  Image Test 
100005  Test 
100006  Test Image 3 
100007  Test Image 4 
100008  Test Image 5 
100009  Image Comparison Test 2 
100010  Testing 
100011  Test Fields 
100012  Test 5 
100013  test 

SECONDARYTABLE 
KEYCOLUMN SUBKEY DATECOLUMN 
100000  100000 2017-06-02 04:09:57.593 
100001  100001 2017-06-19 12:09:54.093 
100001  100002 2017-06-27 10:51:14.140 
100004  100003 2017-06-27 12:33:47.747 
100006  100004 2017-06-28 10:29:53.387 
100007  100005 2017-06-28 10:36:23.710 
100008  100006 2017-06-29 22:31:03.790 
100009  100007 2017-06-29 23:07:52.870 
100009  100010 2017-10-04 16:05:40.583 
100009  100011 2017-10-04 16:09:55.470 
100011  100008 2017-09-08 14:02:28.017 
100012  100009 2017-09-11 16:17:23.870 
100013  100012 2017-11-07 16:55:55.403 
100013  100013 2017-11-08 15:37:16.430 

以下は多かれ少なかれ私が何をしているかのアイデアです。

SELECT DISTINCT(a.[INFOCOLUMN]) 
FROM [PRIMARYTABLE] a 
INNER JOIN [SECONDARYTABLE] b ON (a.[KEYCOLUMN] = b.[KEYCOLUMN]) 
ORDER BY a.[DATECOLUMN] 

ここでは、ホーマーシンプソンが「Doh!」を望んでいます。一度私はそれが行われることになっているのを見る。

非常に高く評価されています。

答えて

1
  1. the most recently run campaignsそれをテスト(ROW_NUMBERを使用するためにやったスタブは..です。DESC)
  2. that get run the most frequent >>ウィンドウ関数を使用してCOUNT(*)を超える(..によってパーティション)

を使用およびcount() over()を使用すると、「最新の」行と「最も頻度の高い」データの行を選択できます。日付のDESCending命令は、「最近」= 1になります。

select 
     p.*, s.* 
from PRIMARYTABLE p 
inner join (
     select KEYCOLUMN, SUBKEY, DATECOLUMN 
      , row_number() over(partition by KEYCOLUMN order by DATECOLUMN DESC) recent 
      , count(*) over(partition by KEYCOLUMN) frequency 
     from SECONDARYTABLE 
    ) s on p.KEYCOLUMN = s.KEYCOLUMN and s.recent = 1 
order by s.frequency DESC, p.INFOCOLUMN 
1

あなたはこれを試すことができます。

DECLARE @PRIMARYTABLE TABLE 
(
    [KEYCOLUMN] INT 
    ,[INFOCOLUMN] VARCHAR(24) 
); 

DECLARE @SECONDARYTABLE TABLE 
(
    [KEYCOLUMN] INT 
    ,[SUBKEY] INT 
    ,[DATECOLUMN] DATETIME2 
); 

INSERT INTO @PRIMARYTABLE ([KEYCOLUMN], [INFOCOLUMN]) 
VALUES (100000, 'Test 1') 
     ,(100001, 'Test Campaign') 
     ,(100002, 'Test Image 2') 
     ,(100003, 'Test Img') 
     ,(100004, 'Image Test') 
     ,(100005, 'Test') 
     ,(100006, 'Test Image 3') 
     ,(100007, 'Test Image 4') 
     ,(100008, 'Test Image 5') 
     ,(100009, 'Image Comparison Test 2') 
     ,(100010, 'Testing') 
     ,(100011, 'Test Fields') 
     ,(100012, 'Test 5') 
     ,(100013, 'test'); 

INSERT INTO @SECONDARYTABLE ([KEYCOLUMN], [SUBKEY], [DATECOLUMN]) 
VALUES (100000, 100000, '2017-06-02 04:09:57.593') 
     ,(100001, 100001, '2017-06-19 12:09:54.093') 
     ,(100001, 100002, '2017-06-27 10:51:14.140') 
     ,(100004, 100003, '2017-06-27 12:33:47.747') 
     ,(100006, 100004, '2017-06-28 10:29:53.387') 
     ,(100007, 100005, '2017-06-28 10:36:23.710') 
     ,(100008, 100006, '2017-06-29 22:31:03.790') 
     ,(100009, 100007, '2017-06-29 23:07:52.870') 
     ,(100009, 100010, '2017-10-04 16:05:40.583') 
     ,(100009, 100011, '2017-10-04 16:09:55.470') 
     ,(100011, 100008, '2017-09-08 14:02:28.017') 
     ,(100012, 100009, '2017-09-11 16:17:23.870') 
     ,(100013, 100012, '2017-11-07 16:55:55.403') 
     ,(100013, 100013, '2017-11-08 15:37:16.430'); 


SELECT a.[INFOCOLUMN] 
     ,b.[DATECOLUMN] 
FROM @PRIMARYTABLE A 
CROSS APPLY 
(
    SELECT TOP 1 [DATECOLUMN] 
    FROM @SECONDARYTABLE B 
    WHERE A.[KEYCOLUMN] = B.[KEYCOLUMN] 
    ORDER BY [DATECOLUMN] DESC 
) b; 

は、それはあなたに各キャンペーンの最後の実行を与えるだろう。日付またはORDER BYでフィルタリングし、最終クエリからTOP Nを取得できます。

それとも、ROW_NUMBERを使用することができます。

WITH DataSource AS 
(
    SELECT A.[INFOCOLUMN] 
      ,B.[DATECOLUMN] 
      ,ROW_NUMBER() OVER (PARTITION BY A.[KEYCOLUMN] ORDER BY B.[KEYCOLUMN]) AS [RowID] 
    FROM @PRIMARYTABLE A 
    INNER JOIN @SECONDARYTABLE B 
     ON A.[KEYCOLUMN] = B.[KEYCOLUMN] 
) 
SELECT [INFOCOLUMN] 
     ,[DATECOLUMN] 
FROM DataSource 
WHERE [RowID] = 1; 
1

これを試してみてください、それはほとんどの使用頻度の高い順にキャンペーンのリストを返します。あなたのリストに表示されないキャンペーンは実行されません。この場合には、あなたは左を行う意志、ここ

SELECT a.[INFOCOLUMN] 
FROM [PRIMARYTABLE] a 
/* left */ JOIN [SECONDARYTABLE] b ON a.[KEYCOLUMN] = b.[KEYCOLUMN] 
group BY a.[infocolumn] 
order by max(datecolumn) desc 

に参加iを順番...(上)>>

select 10000 id,'Campain A' cname into #a1 union all 
select 10002,'Campain B' union all 
select 10004,'Campain C' union all 
select 10009,'Campain E' 

select 10000 id,'20170101' thedate into #a2 union all 
select 10000,'20170102' union all 
select 10009,'20170103' union all 
select 10002,'20170104' union all 
select 10004,'20170105' union all 
select 10000,'20170201' union all 
select 10000,'20170302' union all 
select 10009,'20170403' union all 
select 10002,'20170104' union all 
select 10004,'20170205' union all 
select 10000,'20170101' union all 
select 10004,'20170302' union all 
select 10000,'20170103' union all 
select 10002,'20170404' union all 
select 10002,'20170105' 

select #a1.cname 
from #a1 join #a2 on #a1.id = #a2.id 
group by #a1.cname 
order by max(thedate) desc 
関連する問題