SQL เลือกแถวตามวันที่ล่าสุด


106

เมื่อใช้แบบสอบถามและผลลัพธ์ต่อไปนี้ฉันกำลังมองหารายการล่าสุดที่ ChargeId และ ChargeType ไม่ซ้ำกัน

select chargeId, chargeType, serviceMonth from invoice

    CHARGEID    CHARGETYPE  SERVICEMONTH
1   101     R       8/1/2008
2   161     N       2/1/2008
3   101     R       2/1/2008
4   101     R       3/1/2008
5   101     R       4/1/2008
6   101     R       5/1/2008
7   101     R       6/1/2008
8   101     R       7/1/2008

ต้องการ:

    CHARGEID    CHARGETYPE  SERVICEMONTH
1   101     R       8/1/2008
2   161     N       2/1/2008

คำตอบ:


147

คุณสามารถใช้GROUP BYเพื่อจัดกลุ่มรายการตามประเภทและรหัส จากนั้นคุณสามารถใช้ฟังก์ชันMAX () Aggregate เพื่อรับเดือนบริการล่าสุด ด้านล่างส่งคืนผลลัพธ์ที่ตั้งค่าด้วย ChargeId, ChargeType และ MostRecentServiceMonth

SELECT
  CHARGEID,
  CHARGETYPE,
  MAX(SERVICEMONTH) AS "MostRecentServiceMonth"
FROM INVOICE
GROUP BY CHARGEID, CHARGETYPE

1
อย่าลืมเปลี่ยนชื่อฟิลด์ MAX (serviceMonth) ในกรณีที่คุณต้องการใช้แบบดาวน์สตรีม
Ben Hoffstein

2
ตกลงแล้วจะเกิดอะไรขึ้นถ้ามีแถว 101 N 1/1/2008 ในตาราง?
tvanfosson

3
คุณจะได้รับแถวพิเศษคืน ซึ่งเป็นผลลัพธ์ที่ต้องการตามความต้องการของเขา
Carlton Jenke

1
เพิ่มนามแฝงในแบบสอบถามในโพสต์ tvanfosson - นั่นจะเป็นเงื่อนไขที่เพิ่มเข้าไปในชุดผลลัพธ์ซึ่งถูกต้อง
ผู้ขาย Mitchel

1
หากฉันต้องการดึงรหัสบันทึกด้วย ฉันจะทำอย่างไร
Donny V.

58

ดังนั้นนี่ไม่ใช่สิ่งที่ผู้ร้องขอต้องการ แต่เป็นคำตอบของ "SQL ที่เลือกแถวตามวันที่ล่าสุด"

แก้ไขจากhttp://wiki.lessthandot.com/index.php/Returning_The_Maximum_Value_For_A_Row

SELECT t.chargeId, t.chargeType, t.serviceMonth FROM( 
    SELECT chargeId,MAX(serviceMonth) AS serviceMonth
    FROM invoice
    GROUP BY chargeId) x 
    JOIN invoice t ON x.chargeId =t.chargeId
    AND x.serviceMonth = t.serviceMonth

2
ขอบคุณ! นี่คือสิ่งที่ฉันกำลังมองหา!
Diana

ดูเหมือนจะไม่เข้ากันได้กับมุมมอง
nuzzolilo


6

ฉันเห็นนักพัฒนาส่วนใหญ่ใช้การสืบค้นแบบอินไลน์โดยไม่ได้มองว่ามันส่งผลกระทบต่อข้อมูลขนาดใหญ่

ง่ายๆคุณสามารถทำได้โดย:

select a.chargeId, a.chargeType, a.serviceMonth 
from invoice a
left outer join invoice b
on a.chargeId=b.chargeId and a.serviceMonth <b.serviceMonth 
where b.chargeId is null
order by a.serviceMonth desc

1
select to.chargeid,t0.po,i.chargetype from invoice i
inner join
(select chargeid,max(servicemonth)po from invoice 
group by chargeid)t0
on i.chargeid=t0.chargeid

ข้อความค้นหาข้างต้นจะใช้งานได้หากรหัสการเรียกเก็บเงินที่แตกต่างกันมีชุดประเภทอักขระที่แตกต่างกันหวังว่าแบบสอบถามง่ายๆนี้จะช่วยให้มีเวลาในการทำงานเพียงเล็กน้อยในการพิจารณา ...

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