การส่งคืนชุดผลลัพธ์ที่มีหลายแถวตามวันที่สูงสุด


16

ฉันมีตารางเด็กที่เป็นเช่นนี้:

[ตารางวันที่ Cust]

| Customer ID | Some Date  | Balance |
+-------------+------------+---------+
|           1 | 2012-04-30 |   20.00 |
|           1 | 2012-03-31 |   50.00 |
|           2 | 2012-04-30 |    0.00 |
|           2 | 2012-03-31 |   10.00 | 
|           3 | 2012-03-31 |   60.00 |
|           3 | 2012-02-29 |   10.00 |

ฉันต้องการได้รับชุดผลลัพธ์เช่นนี้ - หนึ่งระเบียนสำหรับลูกค้าแต่ละรายที่มีวันที่ล่าสุด:

| Customer ID | Some Date  | Balance |
+-------------+------------+---------+
|           1 | 2012-04-30 |   20.00 | 
|           2 | 2012-04-30 |    0.00 |
|           3 | 2012-03-31 |   60.00 |

ฉันรู้ว่าฉันสามารถทำสิ่งนี้สำหรับ "รหัสลูกค้า" แต่ละรายด้วย SQL (ไวยากรณ์เซิร์ฟเวอร์ SQL) ต่อไปนี้:

select top 1  [Some Date], [Customer ID], [Balance]
from [Cust Date Table]
where [Customer ID] = 2
order by [Some Date] desc


| Customer ID | Some Date  | Balance |
+-------------+------------+---------+
|           2 | 2012-04-30 |    0.00 |

แต่ฉันไม่แน่ใจว่าจะรับทั้งสามรายการที่ฉันต้องการได้อย่างไร ฉันไม่แน่ใจว่านี่เป็นสถานการณ์ที่เรียกใช้แบบสอบถามย่อยหรืออย่างอื่น

โปรดทราบว่าวันที่สูงสุดอาจแตกต่างกันไปตาม [รหัสลูกค้า] ใด ๆ (ในตัวอย่างนี้วันที่สูงสุดของลูกค้า 3 คือ 2012-03-31 ในขณะที่บันทึกอื่น ๆ มีวันที่สูงสุดปี 2012-04-30) ฉันเหนื่อย

select [Customer ID], MAX([Some Date]) AS [Latest Date], Balance 
from [Cust Date Table] 
group by [Customer ID], Balance; 

ปัญหาคือสิ่งนี้ไม่ได้ส่งคืนเพียงแถวเดียวสำหรับลูกค้าแต่ละราย แต่จะคืนค่าหลายแถว

คำตอบ:


18

คุณเพียงแค่ต้องการ:

SELECT
    [Customer ID],
    MAX([Some Date]) AS[Latest Date]
FROM[Cust Date TABLE]
GROUP BY
    [Customer ID];

ตกลง - คุณได้แก้ไขแล้ว ตอนนี้คุณต้องการสั่งซื้อแถวและเลือกแถวบนสุด:

WITH numbered AS (
    SELECT
        [Customer ID],
        [Some Date],
        [Balance],
        ROW_NUMBER() OVER (
            PARTITION BY
                [Customer ID]
            ORDER BY
                [Some Date] DESC
        ) AS rownum
    FROM[Cust Date TABLE]
)
SELECT
    [Customer ID],
    [Some Date],
    [Balance]
FROM numbered
WHERE
    rownum = 1;

โอ้ - คุณเปลี่ยนคำถามหรือไม่
Rob Farley

เปลี่ยนคำตอบของฉันตอนนี้
Rob Farley

ข้อดีอย่างหนึ่ง (หรือข้อเสียขึ้นอยู่กับความต้องการของคุณ) ของการแก้ปัญหานี้คือถ้าวันที่ล่าสุดเกิดขึ้นในแถวมากกว่าหนึ่งสำหรับลูกค้าเดียวกันมันจะไม่ให้ผลลัพธ์ที่ซ้ำกัน
ทิม

7

ฉันคิดว่าคุณชอบอะไรแบบนี้

select c.[customer ID], [some date], balance
from [cust date table] c
inner join 
    ( select [customer ID], MAX([some date]) as maxdate
    from [cust date table]
    group by [customer ID]) c2
on c2.[customer ID] = c.[customer ID]
and c2.maxdate = c.[some date]

มีหลายรูปแบบเช่น CTE ตัวแปรตาราง #table ที่คุณสามารถเล่นด้วยเพื่อดูว่าอะไรจะให้ประสิทธิภาพที่ดีที่สุดในสถานการณ์ของคุณ


คำตอบนี้ถูกต้องเช่นกัน น่าเสียดายที่ฉันมีตัวแทนไม่เพียงพอในการโหวตและฉันต้องเลือกคำตอบเดียว
Joe DBA
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.