วิธีอ่านแถวสุดท้ายด้วย SQL Server


89

วิธีใดที่มีประสิทธิภาพที่สุดในการอ่านแถวสุดท้ายด้วย SQL Server

ตารางจะจัดทำดัชนีด้วยคีย์ที่ไม่ซ้ำกัน - ค่าคีย์ "ด้านล่าง" แสดงถึงแถวสุดท้าย

คำตอบ:


181

หากคุณใช้ MS SQL คุณสามารถลอง:

SELECT TOP 1 * FROM table_Name ORDER BY unique_column DESC 

17
จะเป็นอย่างไรถ้าคุณมีข้อมูล 5 ล้านรายการใน DB! : - \
deepdive

5
หากตารางถูกจัดทำดัชนีในคอลัมน์การจัดเรียง SQL จะอ่านแถวสุดท้ายของตาราง ไม่จำเป็นต้องมีการจัดเรียงหรือสแกนแบบเต็มตารางที่มีราคาแพง
Spivonious

ถ้าฉันต้องการรับ 1,000 บันทึกล่าสุดฉันจะได้รับอย่างไรบอกได้ไหม
ศรี

1
@Sri คุณจะดำเนินการSELECT TOP 1000 * FROM table_name ORDER BY column_name DESCและควรส่งออกข้อมูล 1,000 รายการล่าสุด
Rod Argumedo


18

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

SELECT * FROM table_name ORDER BY unique_column DESC LIMIT 1

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


5
ว้าวรุนแรงคำถามเดิมไม่ได้พูดถึง SQL Server โดยเฉพาะ โซลูชันข้างต้นถูกต้องตามกฎหมายอย่างสมบูรณ์แม้ว่า SQL Server จะใช้คำที่แตกต่างกันเพื่ออธิบายแนวคิดเดียวกัน +1
Greg Hewgill

@VinkoVrsalovic มันไม่ได้หมายความว่าคำตอบนั้นไร้ประโยชน์ในทางตรงกันข้ามแม้ว่าจะผ่านไปสิบปี คุณเห็นด้วยกับฉันไหมครับ?
snr

1
นี่คือปัญหาในการสื่อสารด้วยลายลักษณ์อักษร - มันง่ายที่จะอ่านรุนแรงกว่าที่ตั้งใจไว้มากโดยเฉพาะอย่างยิ่งเมื่อมันสั้น! ตอนนี้ฉันรู้แล้วและฉันเข้าใจว่าความรับผิดชอบอยู่ที่นักเขียน ดังนั้นถ้าฉันจะเขียนในวันนี้ฉันจะพูดว่า: "นั่นเป็นแนวคิดแม้ว่าคุณจะต้องใช้ TOP แทน LIMIT สำหรับ SQL Server เนื่องจากเป็นเครื่องมือ DMBS ที่ติดแท็กในคำถามดูdocs.microsoft.com / en-us / sql / t-sql / queries / … "@snr
Vinko Vrsalovic

11

หาก id บางส่วนของคุณอยู่ในลำดับฉันสมมติว่าจะมีคำสั่งบางอย่างในฐานข้อมูลของคุณ

SELECT * FROM TABLE WHERE ID = (SELECT MAX(ID) FROM TABLE)


4

ฉันคิดว่าแบบสอบถามด้านล่างจะใช้ได้กับ SQL Server ที่มีประสิทธิภาพสูงสุดโดยไม่มีคอลัมน์ที่เรียงลำดับได้

SELECT * FROM table 
WHERE ID not in (SELECT TOP (SELECT COUNT(1)-1 
                             FROM table) 
                        ID 
                 FROM table)

หวังว่าคุณจะเข้าใจมัน ... :)


นี่เป็นทางออกที่ดีที่สุดเมื่อคุณไม่สามารถจัดเรียง DESC ได้และคุณต้องการเพียงแค่แถวสุดท้ายเมื่อส่งคืน
jjthebig1

3

ฉันลองใช้ last ใน sql query ใน SQl server 2008 แต่มันทำให้ err: "'last' ไม่ใช่ชื่อฟังก์ชันในตัวที่รู้จัก"

ดังนั้นฉันจึงใช้:

select max(WorkflowStateStatusId) from WorkflowStateStatus 

เพื่อรับรหัสของแถวสุดท้าย สามารถใช้

Declare @i int
set @i=1
select WorkflowStateStatusId from Workflow.WorkflowStateStatus
 where WorkflowStateStatusId not in (select top (
   (select count(*) from Workflow.WorkflowStateStatus) - @i ) WorkflowStateStatusId from .WorkflowStateStatus)

3

คุณสามารถใช้ last_value: SELECT LAST_VALUE(column) OVER (PARTITION BY column ORDER BY column)...

ฉันทดสอบที่ฐานข้อมูลแห่งหนึ่งของฉันและทำงานได้ตามที่คาดไว้

คุณสามารถตรวจสอบเอกสารได้ที่นี่: https://msdn.microsoft.com/en-us/library/hh231517.aspx


2

ลองทำตามนี้

SELECT id from comission_fees ORDER BY id DESC LIMIT 1

1
เป็นความคิดเห็นข้างต้นโดย @Vinko Vrsalovic กล่าว MSSQL LIMITไม่ได้ใช้ ผลตอบแทนนี้Incorrect syntax near LIMIT
frmbelz

1

ในการดึงข้อมูลแถวสุดท้ายของตารางสำหรับฐานข้อมูล MS SQL 2005 คุณสามารถใช้แบบสอบถามต่อไปนี้:

select top 1 column_name from table_name order by column_name desc; 

หมายเหตุ:ในการรับแถวแรกของตารางสำหรับฐานข้อมูล MS SQL 2005 คุณสามารถใช้แบบสอบถามต่อไปนี้:

select top 1 column_name from table_name; 

2
select top 1การไม่มีคำสั่งซื้อไม่ใช่วิธีที่เชื่อถือได้ในการรับบันทึกแรก หากคุณไม่ได้เรียงลำดับตามแสดงว่าคุณอนุญาตให้ SQL ให้บันทึกใด ๆ ที่คุณพอใจ
Code Magician

1

หากคุณไม่มีคอลัมน์ที่เรียงลำดับคุณสามารถใช้ ID ทางกายภาพของแต่ละบรรทัด:

SELECT top 1 sys.fn_PhysLocFormatter(%%physloc%%) AS [File:Page:Slot], 
              T.*
FROM MyTable As T
order by sys.fn_PhysLocFormatter(%%physloc%%) DESC

นี่เป็นคำตอบที่ดีมากสำหรับ abstractions โดยที่ช่องหลักอาจไม่เป็นที่รู้จักหรืออาจไม่มีอยู่จริง อย่างไรก็ตาม %% physloc %% จากน้อยไปหามากและการเรียงลำดับตามฟิลด์ที่จัดรูปแบบทำให้เกิดข้อผิดพลาดเช่น (1: 2: 30) ปรากฏน้อยกว่า (1: 2: 4) แนะนำให้เปลี่ยนคำค้นหาเพื่อลบฟอร์แมตเตอร์และใช้ %% physloc %% โดยตรงแทนเช่น ---- order by %% physloc %% desc ----
MoustacheDangerous

1

OFFSETและFETCH NEXTเป็นคุณลักษณะของ SQL Server 2012 เพื่อให้ได้เพจของ SQL ในขณะที่แสดงผลลัพธ์

OFFSETอาร์กิวเมนต์จะใช้ในการตัดสินใจแถวแถวเริ่มต้นที่จะกลับมาจากผลและFETCHข้อโต้แย้งที่ใช้ในการแสดงชุดของจำนวนของแถว

SELECT *
FROM table_name
ORDER BY unique_column desc
OFFSET 0 Row
FETCH NEXT 1 ROW ONLY

0
SELECT * from Employees where [Employee ID] = ALL (SELECT MAX([Employee ID]) from Employees)

1
คำตอบที่ดีที่สุดในทำนองเดียวกันเราจะได้รับแถวแรก SELECT * จากพนักงานโดยที่ [รหัสพนักงาน] = ทั้งหมด (SELECT MIN ([รหัสพนักงาน]) จากพนักงาน)
มนัส

0

นี่คือวิธีที่คุณได้รับเรกคอร์ดล่าสุดและอัพเดตฟิลด์ใน Access DB

อัปเดต compalints SET tkt = addzone &'-'& customer_code &'-'& sn where sn in (select max(sn) from compalints )


0

หากคุณมีตาราง Replicated คุณสามารถมี Identity = 1000 ใน localDatabase และ Identity = 2000 ใน clientDatabase ได้ดังนั้นหากคุณจับ ID สุดท้ายคุณอาจพบว่าเป็นตัวสุดท้ายจากไคลเอนต์เสมอไม่ใช่ตัวสุดท้ายจากฐานข้อมูลที่เชื่อมต่อปัจจุบัน ดังนั้นวิธีที่ดีที่สุดในการส่งคืนฐานข้อมูลที่เชื่อมต่อล่าสุดคือ:

SELECT IDENT_CURRENT('tablename')

0

ฉันไม่ได้รับ "ค่าสุดท้าย" ในตารางฉันได้รับมูลค่าสุดท้ายต่อเครื่องมือทางการเงิน มันไม่เหมือนกัน แต่ฉันเดาว่ามันเกี่ยวข้องกับบางคนที่กำลังมองหา "วิธีการทำตอนนี้" ฉันยังใช้ RowNumber () และ CTE และก่อนหน้านั้นเพื่อรับ 1 และเรียงลำดับตาม [คอลัมน์] desc อย่างไรก็ตามเราไม่จำเป็นต้อง ...

ฉันใช้ SQL Server 2017 เรากำลังบันทึกเห็บทั้งหมดในการแลกเปลี่ยนทั้งหมดทั่วโลกเรามี ~ 12 พันล้านเห็บต่อวันเราจัดเก็บการเสนอราคาถามและการค้าแต่ละรายการรวมทั้งปริมาณและคุณลักษณะของเห็บ (การเสนอราคาถามแลกเปลี่ยน ) ของการแลกเปลี่ยนใด ๆ ที่กำหนด

เรามีข้อมูลเห็บ 253 ประเภทสำหรับสัญญาใด ๆ (ส่วนใหญ่เป็นสถิติ) ในตารางนั้นราคาซื้อขายล่าสุดคือประเภทเห็บ = 4 ดังนั้นเมื่อเราต้องการรับ "สุดท้าย" ของราคาที่เราใช้:

select distinct T.contractId,
LAST_VALUE(t.Price)over(partition by t.ContractId order by created ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
from [dbo].[Tick] as T
where T.TickType=4

คุณสามารถดูแผนการดำเนินการในระบบ dev ของฉันมันดำเนินการค่อนข้างมีประสิทธิภาพดำเนินการใน 4 วินาทีในขณะที่ ETL นำเข้าแลกเปลี่ยนกำลังสูบข้อมูลลงในตารางจะมีการล็อกบางอย่างที่ทำให้ฉันช้าลง ... นั่นเป็นเพียงวิธีการทำงานของระบบจริง แผนการดำเนินการกับ 85,697,659 แถว


-1
SELECT * FROM TABLE WHERE ID = (SELECT MAX(ID) FROM TABLE)

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

-5

ฉันค่อนข้างมั่นใจว่ามันคือ:

SELECT last(column_name) FROM table

เพราะฉันใช้สิ่งที่คล้ายกัน:

SELECT last(id) FROM Status

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