【问题标题】:Show min value of duplicate row value as column value将重复行值的最小值显示为列值
【发布时间】:2022-09-27 19:13:03
【问题描述】:

更详细的问题。我有一个名为 CALCS 的表,其结构: code 是记录标识符(不是唯一的) value1、value2、value3、value4 是要求和的不同值 价格是工作成本 我必须为所有记录返回 price+value1+value2+value3+value4。如果有重复记录(相同代码的 2 次,而不是更多次),我需要一个名为 value5 或计算值的新列,其负值为 1,并且必须出现在总和中。记录示例:

code    value1  value2  value3  value4  price
001579  93,1    0       0      0       280
001585  83,13   0       0      0       250
001592  250     0       0      0       500
001592  50      0       0      0       500
001593  84      0       0      33      240

唯一的记录重复是代码 001592。我需要的结果是:

code    value1  value2  value3  value4  price    total
001579  93,1    0       0      0       280       373,1
001585  83,13   0       0      0       250       333,13
001592  250     0       0      0       500       800 (first row values + value 1 of second row)
001593  84      0       0      33      240       357

谢谢,

  • 代码是否只有 2 个值?
  • 800的总数是怎么计算的?您是否将 250 和 50 的总和添加到第一行的价格中?
  • 总共800是第二行同码(001592)的value1(250)+value2(0)+value3(0)+value4(0)+price(500)+value1(50)之和
  • 无法根据已发布的示例数据识别第一行和第二行,因此您的要求是不可能的。此外,这与原始问题如此不同,为了您的利益,您应该删除并提出新问题,因为如果发布了许多答案,观众可能会简单地忽略。
  • 我在对我的回答的评论中指出,您实际上使用的是 mariadb 而不是 mysql - 这两种方言不一样,您应该标记 mariadb。

标签: mysql mariadb virtual-column


【解决方案1】:

相反,您可以创建一个view其中通过按代码分组,使用窗口函数得出所需的值,例如

CREATE OR REPLACE VIEW v_tab AS 
SELECT t.*, MIN(value1) OVER (PARTITION BY code) AS value2
  FROM tab t --yourTable

【讨论】:

  • 这不是在输出中给出 2 行吗?
  • 是的,它给出了两行 @P.Salmon ,但考虑到针对当前外观添加虚拟列的逻辑,不清楚 OP 是否想要这样。
  • 嗨@BarbarosÖzhan,我已经尝试过这个解决方案,但在视图中, value1 和 value2 中的所有值都是相同的
  • 首先,你有更多的样本数据来重现这个案例,你能告诉你的 DB @oraculo 的版本是什么吗?对于您将呈现的给定样本数据集,您想要的输出究竟是什么?你能用这样的细节编辑问题吗......
  • 顺便说一句,不是全部但是一些(只有最小值)值应该返回相同的@oracolo
【解决方案2】:

使用 cte 获取每个代码的 minval

drop table if exists t;
create table t
(CODE int,        VALUE1 int);
insert into t values
(2345   ,     250),
(2345   ,     50);

with cte as 
(select code,min(value1) as value2 from t group by code)
select t.*,cte.value2
from t
join cte on cte.code = t.code and cte.value2 <> value1;

+------+--------+--------+
| CODE | VALUE1 | value2 |
+------+--------+--------+
| 2345 |    250 |     50 |
+------+--------+--------+
1 row in set (0.001 sec)

【讨论】:

  • 嗨 P.Salmon,我已经尝试过了,但是 sintaxis 给了我一个错误
  • 如果您使用的是 8 之前的版本,请将 cte 转换为子查询 - 并发布您使用的版本。
  • 嗨 P.Salmon,我有版本 10.2.36-MariaDB
  • Cte 是在 mariadb 10.2.1 中引入的,所以这应该适合您。你得到了什么错误信息。
  • 嗨 P.Salmon,它工作正常,是我的一栏错误。好的,这仅将 value2 作为虚拟列返回重复行。有可能,像我对问题所做的最后一次编辑一样列出一个列表,在那里我可以看到不重复的行,如果有重复的行,只看到新列的一行?谢谢,很多,
【解决方案3】:

如果每个 CODE 总是有两行,您可以将 VALUE1 视为最大值,将 VALUE2 视为最小值:

SELECT CODE, MAX(VALUE1) AS VALUE1, MIN(VALUE1) AS VALUE2
  FROM mytable
 GROUP BY CODE;

当然,即使每个 CODE 有更多行,这也会返回单行,但是从您的问题中不清楚您到底想要实现什么。

【讨论】:

  • 嗨@Mihe,每个代码并不总是两行,表中有更多列。我需要的是,当两行具有相同的代码时,可以看到第三个“虚拟”列,其中第二行的值是值列。我试过你的查询,但总是返回 0
  • 我不知道,你做了什么,但是查询不能返回 0。这是一个fiddle,你可以自己尝试。但是,当您想要第二行的值时,无论如何它对您没有帮助,您必须使用其他解决方案之一。
  • 嗨@Mihe,对不起,它有效,不返回0。此时,它是有效的。并非所有记录都有两行,CODE 并不总是重复。我有一个 TOTAL 字段,我在其中计算 VALUE1+OTHERCOLUMN 的总和,并且在可用的情况下还必须有 VALUE2。 OTHERCOLUMN(总计)是一个 VIRTUAL GENERATED 字段。我不能把喜欢表达的选择。我该如何解决这个问题?
猜你喜欢
  • 1970-01-01
  • 2021-08-08
  • 1970-01-01
  • 1970-01-01
  • 2016-06-03
  • 2020-03-19
  • 1970-01-01
  • 1970-01-01
  • 2019-09-20
相关资源
最近更新 更多