sql查询以获取具有多个列的第二个最新结果

g6baxovj  于 2021-08-13  发布在  Java
关注(0)|答案(2)|浏览(357)

我正在尝试获取所有不同部分id的第二个最新结果(基于订单日期),以进入我正在制作的报告中,将其与最新结果进行比较。
评论的部分是来自另一种方法,我尝试,但不成功。
非常感谢您的帮助!
(旁注:我是一个新的如此张贴,我提前道歉,如果这是回答其他地方,但我找不到任何有关这个问题)
我正在使用以下查询:

  1. SELECT
  2. PURCHASE_ORDER.ORDER_DATE
  3. , PURC_ORDER_LINE.PART_ID
  4. , PURCHASE_ORDER.VENDOR_ID
  5. , PURC_ORDER_LINE.LINE_STATUS
  6. , PURC_ORDER_LINE.ORDER_QTY
  7. , PURC_ORDER_LINE.UNIT_PRICE
  8. --, ROW_NUMBER() over (ORDER BY PURCHASE_ORDER.ORDER_DATE DESC)AS ROW
  9. , CAST (PURC_ORDER_LINE.ORDER_QTY * PURC_ORDER_LINE.UNIT_PRICE AS VARCHAR) AS TOTAL_COST
  10. FROM
  11. PURCHASE_ORDER
  12. INNER JOIN
  13. PURC_ORDER_LINE
  14. ON
  15. PURCHASE_ORDER.ID = PURC_ORDER_LINE.PURC_ORDER_ID
  16. WHERE PURCHASE_ORDER.ORDER_DATE < (SELECT MAX(ORDER_DATE) FROM PURCHASE_ORDER) AND PURC_ORDER_LINE.PART_ID = 'XXXX'
  17. ORDER BY ORDER_dATE DESC
  18. --WHERE PURC_ORDER_LINE.PART_ID = 'XXXX' and PURCHASE_ORDER.ORDER_DATE = (SELECT MAX(ORDER_DATE) FROM PURCHASE_ORDER WHERE ORDER_DATE < (SELECT MAX(ORDER_DATE) FROM PURCHASE_ORDER))

编辑5/28深夜:
下面是我需要的数据集,每个零件id的第二个结果(第二个基于订单日期描述)

  1. +-------------+---------+-----------+
  2. | ORDER_DATE | PART_ID | VENDOR_ID |
  3. +-------------+---------+-----------+
  4. | 2020-05-29 | XXXX | CVVB |
  5. | 2020-05-27 | XXXX | CVVB |
  6. | 2020-05-28 | XXXX | CVVA |
  7. | 2020-05-28 | YYYY | GGNB |
  8. | 2020-04-12 | YYYY | GGNB |
  9. | 2020-02-08 | YYYY | GGNB |
  10. | 2020-05-28 | ZZZZ | LLNB |
  11. | 2019-10-28 | ZZZZ | LLNB |
  12. | 2019-05-27 | ZZZZ | OKIJ |
  13. +-------------+---------+-----------+

我希望收到以下输出(对于3个以上不同的零件id):

  1. +------------+---------+-----------+
  2. | ORDER_DATE | PART_ID | VENDOR_ID |
  3. +------------+---------+-----------+
  4. | 2020-05-28 | XXXX | CVVA |
  5. | 2020-04-12 | YYYY | GGNB |
  6. | 2019-10-28 | ZZZZ | LLNB |
  7. +------------+---------+-----------+

查询中还有其他列,但将它们格式化为表将花费更长的时间。我删去了几个例子的专栏。
另一个编辑
我不确定这些信息是否有用,但我正在尝试将最近的结果与以前的结果进行比较,以显示定价和供应商之间的差异。我们正在将数据编译成报表生成器;我在这里的方法是创建两个独立的数据集,一个是最新的,另一个是第二个,并在报表生成器中组合来自数据集的数据。如果有一个更容易的方法,我在错误的方向前进,请让我知道!
例子:

  1. +------------+---------+-----------+-------------+----------+------------+
  2. | ORDER_DATE | PART_ID | VENDOR_ID | Porder_Date | Ppart_ID | pVendor_id |
  3. +------------+---------+-----------+-------------+----------+------------+
  4. | 2020-05-29 | XXXX | CVVB | 2020-05-28 | XXXX | CVVA |
  5. | 2020-05-28 | YYYY | GGNB | 2020-04-12 | YYYY | GGNB |
  6. | 2020-05-28 | ZZZZ | LLNB | 2019-10-28 | ZZZZ | LLNB |
  7. +------------+---------+-----------+-------------+----------+------------+

第二天早上编辑
谢谢大家的帮助!在harry发布了他的解决方案之后,我继续进行了一些小的编辑,以获得我需要添加的专栏。我用原来的select语句替换了他的union部分。这里的一切似乎正是我要找的!
代码:

  1. ;
  2. WITH mycte AS
  3. (
  4. SELECT
  5. PURCHASE_ORDER.ORDER_DATE
  6. , PURC_ORDER_LINE.PART_ID
  7. , PURCHASE_ORDER.VENDOR_ID
  8. , PURC_ORDER_LINE.LINE_STATUS
  9. , PURC_ORDER_LINE.ORDER_QTY
  10. , PURC_ORDER_LINE.UNIT_PRICE
  11. , CAST (PURC_ORDER_LINE.ORDER_QTY * PURC_ORDER_LINE.UNIT_PRICE AS VARCHAR) AS TOTAL_COST
  12. FROM
  13. PURCHASE_ORDER
  14. INNER JOIN
  15. PURC_ORDER_LINE
  16. ON
  17. PURCHASE_ORDER.ID = PURC_ORDER_LINE.PURC_ORDER_ID
  18. )
  19. , mycte2 AS
  20. (
  21. SELECT
  22. CONVERT(DATE,order_date) AS order_date
  23. , part_id
  24. , vendor_id
  25. , order_qty
  26. , unit_price
  27. , total_cost
  28. , ROW_NUMBER() over(
  29. PARTITION BY part_id
  30. ORDER BY
  31. CONVERT(DATE,order_date) DESC) AS row_num
  32. FROM
  33. mycte
  34. )
  35. SELECT
  36. mycte2.order_date
  37. , mycte2.part_id
  38. , mycte2.vendor_id
  39. , mycte2.order_qty
  40. , mycte2.unit_price
  41. , mycte2.total_cost
  42. , previous.order_date porder_date
  43. , previous.part_id ppart_id
  44. , previous.vendor_id pvendor_id
  45. , previous.order_qty poqrder_qty
  46. , previous.unit_price punit_price
  47. , previous.total_cost ptotal_cost
  48. FROM
  49. mycte2
  50. LEFT JOIN
  51. mycte2 previous
  52. ON
  53. previous.row_num = mycte2.row_num +1
  54. AND mycte2.part_id = previous.part_id
  55. WHERE
  56. mycte2.row_num = 1
5kgi1eie

5kgi1eie1#

根据您提供的数据,您可以使用cte和行号函数来实现这一点。
注意-它总是有助于显示整个图片,而不是仅仅要求你需要帮助的部分(通常)。。因为如果我们能理解整个问题,回答起来就容易多了!
参见下面的代码

  1. ;with mycte as (
  2. select
  3. '2020-05-29' as order_date , 'XXXX' as part_id , 'CVVB' as vendor_id
  4. union all select
  5. '2020-05-27' , 'XXXX' , 'CVVB'
  6. union all select
  7. '2020-05-28' , 'XXXX' , 'CVVA'
  8. union all select
  9. '2020-05-28' , 'YYYY' , 'GGNB'
  10. union all select
  11. '2020-04-12' , 'YYYY' , 'GGNB'
  12. union all select
  13. '2020-02-08' , 'YYYY' , 'GGNB'
  14. union all select
  15. '2020-05-28' , 'ZZZZ' , 'LLNB'
  16. union all select
  17. '2019-10-28' , 'ZZZZ' , 'LLNB'
  18. union all select
  19. '2019-05-27' , 'ZZZZ' , 'OKIJ'
  20. )
  21. , mycte2 as (
  22. Select
  23. convert(date,order_date) as order_date
  24. ,part_id
  25. ,vendor_id
  26. ,ROW_NUMBER() over( partition by part_id order by convert(date,order_date) desc) as row_num
  27. from mycte
  28. )
  29. Select
  30. mycte2.order_date
  31. ,mycte2.part_id
  32. ,mycte2.vendor_id
  33. ,previous.order_date porder_date
  34. ,previous.part_id ppart_id
  35. ,previous.vendor_id pvendor_id
  36. from mycte2
  37. left join mycte2 previous
  38. on previous.row_num = mycte2.row_num +1
  39. and mycte2.part_id = previous.part_id
  40. where mycte2.row_num = 1

结果

展开查看全部
rt4zxlrg

rt4zxlrg2#

我想这样的方法可以得到第二个最新订单:

  1. ;WITH cteOrders AS (
  2. SELECT ROW_NUMBER() OVER (ORDER BY Order_Date DESC) AS row_num,
  3. PURCHASE_ORDER.ORDER_DATE
  4. , PURC_ORDER_LINE.PART_ID
  5. , PURCHASE_ORDER.VENDOR_ID
  6. , PURC_ORDER_LINE.LINE_STATUS
  7. , PURC_ORDER_LINE.ORDER_QTY
  8. , PURC_ORDER_LINE.UNIT_PRICE
  9. FROM PURCHASE_ORDER
  10. INNER JOIN PURC_ORDER_LINE ON PURCHASE_ORDER.ID = PURC_ORDER_LINE.PURC_ORDER_ID
  11. WHERE PURCHASE_ORDER.ORDER_DATE < (SELECT MAX(ORDER_DATE) FROM PURCHASE_ORDER) AND PURC_ORDER_LINE.PART_ID = 'XXXX'
  12. )
  13. SELECT * FROM cteOrders WHERE row_num = 2

相关问题