0

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

ショップテーブル

buyer   timeArrived               billed     paid

ABC     2013-02-08 10:30:00       60$        45$
CTS     2013-02-18 10:30:00       100$       80$
ABC     2012-03-11 10:30:00       60$        40$
MNT     2012-02-08 10:30:00       100$       60$
CTS     2012-03-11 10:30:00       60$        40$

バイヤー_t テーブル

buyer

ABC
MNT
CTS
GH

バイヤーが「最後に見られた」ときにバイヤーを検索するには、次のようにバイヤーテーブルからショップテーブルにクエリを実行します

SELECT
 v.buyer,
 MAX(s.timeArrived) AS LastSeen
 FROM buyer_t AS b
 INNER JOIN shop as s ON b.buyer = s.buyer
 where 
 l.buyer = 'ABC' or l.buyer = 'CTS'
 GROUP BY b.buyer;

ABC と CTS がいつ買い物をしたかを知ることは問題ありませんが、「請求済み」列と「支払い済み」列も取得するにはどうすればよいですか

4

1 に答える 1

3

代わりにこれを試してください:

SELECT
 b.buyer,
 s.*
FROM buyer_t AS b
INNER JOIN shop as s ON b.buyer = s.buyer
INNER JOIN
(
   SELECT buyer, MAX(timeArrived) AS LastSeen
   FROM shop
   GROUP BY buyer
) AS s2  ON s.buyer = s2.buyer
        AND s.timeArrived = s2.lastSeen
WHERE s.buyer IN ('ABC', 'CTS');

SQL フィドルのデモ

これにより、次のことが得られます。

| BUYER |                     TIMEARRIVED | BILLED | PAID |
-----------------------------------------------------------
|   ABC | February, 08 2013 10:30:00+0000 |    60$ |  45$ |
|   CTS | February, 18 2013 10:30:00+0000 |   100$ |  80$ |

または: SQL Server 2005 を使用しているため、ランキング関数 ROW_NUMBER() OVER(PARTITION BY ... ORDER BY ...)を使用してこれを行うことができます。

WITH CTE
AS
(
    SELECT
      s.*,
      ROW_NUMBER() OVER(PARTITION BY s.buyer
                        ORDER BY timeArrived DESC) AS Rownumber
    FROM buyer_t AS b
    INNER JOIN shop as s ON b.buyer = s.buyer
    WHERE s.buyer IN ('ABC', 'CTS')
) 
SELECT Buyer, TimeArrived, Billed, Paid
FROM CTE 
WHERE Rownumber = 1;

SQL Server の SQL Fiddle デモ

于 2013-03-19T11:23:57.393 に答える