我遇到以下问题:我有一张表import_data
这个表格很丰富
| id | profile_id | sku | vendor | price | importRun |
| 1 | 39 | 123 | myVen | 2.0 | 1 |
| 2 | 39 | 456 | myVen | 2.0 | 1 |
| 3 | 39 | 123 | myVen | 3.0 | 2 |
我需要获得的是所有元素的输出,但只有一次。每个sku必须是独一无二的。更糟糕的是,如果它们是多余的,我需要最新的数据。
我的输出应该是这样的:
| id | profile_id | sku | vendor | price | importRun |
| 2 | 39 | 456 | myVen | 2.0 | 1 |
| 3 | 39 | 123 | myVen | 3.0 | 2 |
关于结构的简短摘要:
ID = PK
sku =文章的唯一标识符
importRun =需要进行比较。
所以,解释一下:我有一个import-script,它读取给定的CSV文件并导入其中列出的所有文章。我定期(每周一次)获得此CSV文件。我需要收集所有数据并保存,以便稍后创建价格演变。
每次导入后,我都会增加 importRun 的数量,这样就不会丢失任何信息(请记住,我无法使用REPLACE INTO
或INSERT IGNORE
。
现在,当我导出它时,如果SKU多次出现,我需要最新的数据。在这种情况下,SKU 123
在两次不同的运行中插入2次。这意味着,由于我最新的Run有2号,我需要这个tupel(并忽略第一个)。
当我使用DISINCT
时,它仍然会输出相同的表,因为它们根本不相同,因为importRun不同。
我应该可以使用GROUP BY
,但我无法确定将采用哪个值,第一个还是最后一个? (importRun 1或2)
更新1
接下来是@mitkosoft的想法,我尝试了以下内容:
SELECT DISTINCT t1.*
FROM import_data t1
INNER JOIN import_profiles imp on t1.profile_id = imp.id
INNER JOIN (
SELECT DISTINCT sku, MAX(importRun) AS importRun
FROM import_data
GROUP BY sku ) t2
ON t1.sku = t2.sku
WHERE imp.creditornr = 73329
AND t1.vendor = 'rackmountit'
AND t1.importRun = t2.importRun
**更新2 ** 我为所有相关的表添加了完整的结构。
答案 0 :(得分:1)
您需要做的就是为每个MAX(importRun)
确定sku
:
SELECT
t1.*
FROM
import_data t1
INNER JOIN (
SELECT sku, MAX(importRun) AS importRun FROM import_data GROUP BY sku
) t2
ON t1.sku = t2.sku
AND t1.importRun = t2.importRun
输出是:
+----+------------+-----+--------+-------+-----------+
| id | profile_id | sku | vendor | price | importRun |
+----+------------+-----+--------+-------+-----------+
| 2 | 39 | 456 | myVen | 2.0 | 1 |
| 3 | 39 | 123 | myVen | 3.0 | 2 |
+----+------------+-----+--------+-------+-----------+
2 rows in set
答案 1 :(得分:0)
也许你可以加入sku = sku
的同一张桌子