2

以下のように2つのテーブルがあります-

販売実績:

    Date    |   Customer   |    ItemSold 
-----------------------------------------
11/01/2013  |     Alex     |     Pen
12/01/2013  |     Rony     |     Paper
13/01/2013  |     Alex     |     Eraser
14/01/2013  |     Marty    |     Eraser
15/01/2013  |     Alex     |     Pen
16/01/2013  |     Rob      |     Paper
17/01/2013  |     Alex     |     Pencil
18/01/2013  |     Alex     |     Pen
19/01/2013  |     Ned      |     Pen
20/01/2013  |     Alex     |     Paper
21/01/2013  |     Alex     |     Pencil
22/01/2013  |     Ned      |     Pen
23/01/2013  |     Alex     |     Eraser
24/01/2013  |     Alex     |     Pen
25/01/2013  |     Alex     |     Pen
26/01/2013  |     Alex     |     Paper
27/01/2013  |     Ned      |     Paper
28/01/2013  |     Alex     |     Pen
29/01/2013  |     Alex     |     Eraser
30/01/2013  |     Alex     |     Pen
31/01/2013  |     Rony     |     Pencil
01/02/2013  |     Alex     |     Eraser
02/02/2013  |     Ned      |     Paper
03/02/2013  |     Alex     |     Pen

優先順位:

ItemName    |    Priority
--------------------------
Pen         |       1
Paper       |       2
Pencil      |       3
Eraser      |       4

以下のように、どの顧客が何を購入する可能性が高いかを知るためのリストを取得したい -

Name   |   Item
----------------
Alex   |   Pen
Rob    |   Paper
Ned    |   Pen
Marty  |   Eraser
Rony   |   Paper

同順位の項目がある場合は、優先順位の高い項目を選択する必要があります。ネッドはペンと紙をそれぞれ 2 回購入しましたが、紙より優先度が高いため、ペンを選択する必要があります。

これに対する SQL クエリは何になりますか?

4

3 に答える 3

1

SQL フィドル

select distinct on (customer)
    customer, itemsold, total
from
    (
        select customer, itemsold, count(*) total
        from sales
        group by customer, itemsold
    ) s
    inner join priority on itemsold = itemname
order by customer, total desc, priority
于 2013-09-07T13:08:14.950 に答える
1

統計的に、探している用語はmode. ウィンドウ/分析関数を使用して計算する 1 つの方法を次に示します。

select customer, ItemSold
from (select customer, ItemSold, count(*),
             row_number() over (partition by customer order by count(*) desc, p.priority
                               ) as seqnum
      from sales s left outer join
           priority p
           on s.ItemSold = p.ItemName
      group by customer, ItemSold
     ) ci
where seqnum = 1;
于 2013-09-07T12:45:50.550 に答える
0

これがこれを行うための最速の方法になると思います。では優先度を使用しましたがorder by、では使用しなかったことに注意しgroup byてください。itemnamepriorityPriority

select distinct on (s.customer)
    s.customer, p.itemname, count(*) as total
from sales as s
    inner join priority as p on p.itemname = s.itemsold
group by s.customer, p.itemname
order by s.customer, total desc, p.priority

それが不可能な場合は、次のクエリを使用できます。

select distinct on (s.customer)
    s.customer, s.itemsold, count(*) as total
from sales as s
    inner join priority as p on p.itemname = s.itemsold
group by s.customer, s.itemsold, p.priority
order by s.customer, total desc, p.priority;

sql fiddle demo

于 2013-09-07T19:25:56.250 に答える