2017-11-18 157 views
0

我需要找到pedimento的原始日期(CUSTOMS文檔) 我有2個表DS_551(詳細信息表)和DS_701糾正的pedimentos表。搜索原始日期 - MYSQL

而表的結構與此類似

DS_551

  • Patente
  • Pedimento
  • 阿杜瓦納斯
  • 日期星帕

DS_701

  • Patente
  • Pedimento
  • 阿杜瓦納斯
  • 日期星帕
  • PatenteAnterior
  • PedimentoAnterior
  • AduanaAnterior
  • FechaAnterior

,我需要找到每個實例的原始日期:

格式:(Patente-Pedimento - 海關大樓)

  • 原始pedimento:4020-8000001-400
  • 1整頓:4020-8009005-400
  • 第2次整改:4020-9001003-400

在所有的情況下,我會在我的桌子上(DS_551)只有在這種情況下第二次(4020-9001003-400)的最後整改,但我需要更新與原pedimento日期又名fecha(4020-8000001-在我的表400)

DS_701行類似於此

Patente|Pedimento|Aduana|Fecha Pago|PatenteAnterior|PedimentoAnterior|AduanaAnterior|FechaAnterior| 
4020|9001003|400|2017-11-17|4020|8009005|400|2017-10-17| 
4020|8009005|400|2017-10-17|4020|8000001|400|2016-01-01| 

在上面的第一行引用到第二整流和previus文檔的數據的例子(第1整流)和第二行引用第一次整改的數據和表格中的原始文件,結尾處的詞「前面」引用了以前的文件數據,所以只有數據4020 | 90010 03 | 400我需要找到4020文檔的日期(出生日期)| 8000001 | 400

SELECT * FROM DS_551 WHERE CONCAT(Patente, Pedimento, Aduana) IN (SELECT CONCAT(Patente, Pedimento, Aduana) FROM DS_701) 

上面的查詢將返回我需要找到原始日期的文件,或有一個文件列表整改。

給出了上面的文件列表我如何循環查找每個項目以找到它們的原始日期?每份文件可以有無數次的更正。

我在MySQL中使用存儲過程,這樣做

小提琴:http://sqlfiddle.com/#!9/64f0a5/12

回答

0

編輯: 試試這個http://sqlfiddle.com/#!9/64f0a5/45

SELECT a.original_pedimento, a.original_fecha, b.* 
FROM 
    (
    SELECT patente, 
      aduana, 
      MIN(CAST(pedimentoanterior AS UNSIGNED)) AS original_pedimento, 
      MIN(CAST(fechaanterior AS DATE)) AS original_fecha 
    FROM ds_701 
    GROUP BY patente , aduana 
    ) a INNER JOIN ds_701 b 
      ON a.patente = b.patente 
      AND a.aduana = b.aduana 

刪除/忽略:

 
SELECT * FROM DS_701 WHERE Patente = '4020' and Aduana = '400' ORDER BY CAST(PedimentoAnterior as unsigned) ASC LIMIT 1; 
+0

它不能直接這樣,因爲表中有很多其他文檔的歷史記錄(大約200k +)我需要對實際文檔的第一次修訂,我們需要按照列表中每個文檔的歷史記錄來獲取每個文檔的原始日期。 –

+0

更新了SQL。假設最小的PedimentoAnterior是原始文檔,則返回以下內容:http://sqlfiddle.com/#!9/64f0a5/45 – PatrickSJ

0

這是一個問題:

我怎麼能 ... 找到原來的日期...?

爲「4020」作爲搜索字符串,「原始日期」,從給定的數據是2016年1月1日

這個查詢將返回「原始日期」爲「4020」

set @patente := '4020'; 
    select 
     min(lafecha) 
    from (
     select Patente, Pedimento, Aduana, `FechaPago` lafecha 
     from DS_701 
     where Patente = @patente 
     union 
     select PatenteAnterior, PedimentoAnterior, FechaAnterior, FechaAnterior 
     from DS_701 
     where PatenteAnterior = @patente 
     ) d1 

結果是:

| min(lafecha) | 
|--------------| 
| 2016-01-01 | 

我們可以把它一步毛皮療法:

set @patente := '4020'; 
select 
* 
from DS_701 
where Patente = @patente 
and coalesce(FechaAnterior,FechaPago) = 
    (select 
      min(lafecha) 
     from (
      select Patente, Pedimento, Aduana, `FechaPago` lafecha 
      from DS_701 
      where Patente = @patente 
      union 
      select PatenteAnterior, PedimentoAnterior, FechaAnterior, FechaAnterior 
      from DS_701 
      where PatenteAnterior = @patente 
      ) d1 
    ) 
; 

它返回 「原始」 行:

| ID | Patente | Pedimento | Aduana | FechaPago | PatenteAnterior | PedimentoAnterior | AduanaAnterior | FechaAnterior | 
|----|---------|-----------|--------|------------|-----------------|-------------------|----------------|---------------| 
| 2 | 4020 | 8009005 | 400 | 2017-10-17 |   4020 |   8000001 |   400 | 2016-01-01 | 

參見:http://sqlfiddle.com/#!9/64f0a5/52

+0

謝謝,但不是我想要做的,每個文檔都有一個Patente,Pedimento,海關大樓,這3場是一個獨特的文檔的鏈接數據,在任何3的變化字段意味着它是一個不同的文檔 –

+0

我想要完整的歷史記錄,但首先我需要獲取最後一個或DS_501表中的最後一個文檔,之後我需要搜索剛剛在先前的搜索並執行此操作,直到歷史記錄表中沒有更多以前的文檔,即DS_701 –

+0

後面的示例,我想用文檔4020 | 8000001 | 400 |的日期更新文檔或行(4020 | 9001003 | 400)但我不能直接得知它,因爲我需要關注所有文檔的歷史,因爲它不知道我的以前的每個文件的數量都有 –