如何从SQL上的组中检索最大值日期

时间:2018-08-12 08:45:25

标签: sql-server

有人可以向我建议一个我正在使用的SQL查询吗?

我有两个表:

表_1 pos_tran,其架构类似于:

pos_tran
( 
entry_no CHAR 8 (NOT NULL PK),
barcode CHAR 8,
tran_amt NUMERIC 9,
tran_qty NUMERIC 9,
des CHAR 20
)

表_2 pos_tran_hd和架构:

pos_tran_hd
(
entry_no CHAR 8 (NOT NULL PK), 
Location_id CHAR 3,
entry_date DATETIME8,
)

现在,我想使用entry_no将两个表合并后对条形码进行分组,并在撰写本文时从列表中检索max(last date)条目,如果有人强调我的话

SELECT pthd.maxed, pt.barcode, tran_amt, tran_qty from pos_tran pt,
(
 SELECT entry_no, max(entry_date) maxed 
 FROM
 pos_tran_hd 
 where location_id=015 GROUP BY entry_no
)
pthd 
WHERE pthd.entry_no=pt.entry_no 
ORDER BY barcode,pthd.maxed

但这无法按我的意愿工作,这样就给了我约200,000条记录,却没有给出最大日期,这样:

2014-06-23 00:00:00.000 21155192 28000.000 7.00

2014-07-01 00:00:00.000 21155192 4000.000 1.00

2014-07-08 00:00:00.000 21155192 8000.000 2.00

2014-07-12 00:00:00.000 21155192 12000.000 3.00

2014-08-13 00:00:00.000 21155192 4000.000 1.00

2014-09-16 00:00:00.000 21155192 12000.000 3.00

2014-10-06 00:00:00.000 21155192 12000.000 3.00

2015-01-26 00:00:00.000 21155192 12000.000 3.00

2015-05-29 00:00:00.000 21155192 4000.000 1.00

2018-01-05 00:00:00.000 21155192 28000.000 4.00

但是实际上它应该给我最后一条包含max(entry-date)的记录,而数据库中最糟糕的部分是我正在Ms-SQL 2000上工作。

如果有人有正面建议,请帮助我。谢谢。

2 个答案:

答案 0 :(得分:1)

您的第二个查询按entry_date选择一个最大的entry_no,而每个entry_date仅一个entry_no。在描述中,您所说的是“按条形码分组” ...但是,按条形码分组(每个条形码仅显示一行)时,您将无法显示 amount quantity

所以,让我们从这个开始:

select pt.barcode, max(pthd.entry_date) maxed
from pos_tran pt
  inner join pos_tran_hd pthd on pt.entry_no = pthd.entry_no
group by pt.barcode
order by pt.barcode

然后,要显示完整的行,并显示每个entry_date的最后barcode,并且由于您仍在使用SQL Server 2000,我们需要一个子查询来计算每个{{1的maxed }}就像我之前所做的,并将这些值与我们要显示的值进行比较:

barcode

答案 1 :(得分:0)

您需要max()函数从pos_tran_hd中获取最大日期,然后与之结合并获取其余字段,然后与pos_tran结合以获取相应的最大日期结果

pthd.maxed,pt.barcode,tran_amt,tran_qty

 select t.maxed,ps.barcode,ps.tran_amt,ps.tran_qty from 
 (SELECT pd.*
    from pos_tran_hd pd
     inner join
    (
     SELECT max(entry_date) maxed 
     FROM
     pos_tran_hd 
    )
    pthd 
     on pthd.maxed=pos_tran_hd.entry_date
    ) as t inner join pos_tran ps on t.entry_no =ps.entry_no