如何比较来自同一列和不同行但同一表的值?

Posted

技术标签:

【中文标题】如何比较来自同一列和不同行但同一表的值?【英文标题】:How do I compare values from same column and different row but same table? 【发布时间】:2021-09-01 18:29:42 【问题描述】:

我正在尝试获取特定帐户名称的 startdate 不同的记录。我有以下示例数据。

示例数据脚本如下

create table Meter (AccountNumer varchar(50), MeterNumber varchar(50), StartDate date)
Insert into Meter Values('0142628117','123470203','4/22/2020')
Insert into Meter Values('0142628117','123470205','4/22/2020')
Insert into Meter Values('0160059948','100094717','4/24/2020')
Insert into Meter Values('0160059948','328144931','4/24/2020')
Insert into Meter Values('0500000178767001363445','TCA105238304','10/2/2018')
Insert into Meter Values('0500000178767001363445','TCA130359929','8/12/2019')
Insert into Meter Values('0500071816677001432356','1ND386803501','8/20/2019')
Insert into Meter Values('0500071816677001432356','99D024666064','7/18/2019')


RowNo   AccountNumber           MeterNumber     StartDate
    1   0500000178767001363445  TCA105238304    10/2/2018
    2   0500000178767001363445  TCA130359929    8/12/2019
    3   0160059948              100094717       4/24/2020
    4   0160059948              328144931       4/24/2020
    5   0500071816677001432356  1ND386803501    8/20/2019
    6   0500071816677001432356  99D024666064    7/18/2019
    7   0142628117              123470203       4/22/2020
    8   0142628117              123470205       4/22/2020

我试图只获取帐号(两行)的开始日期不同的记录。所以我期望的结果如下表所示。

预期结果

RowNo   AccountNumber           MeterNumber     StartDate
    1   0500000178767001363445  TCA105238304    10/2/2018
    2   0500000178767001363445  TCA130359929    8/12/2019
    5   0500071816677001432356  1ND386803501    8/20/2019
    6   0500071816677001432356  99D024666064    7/18/2019

任何帮助将不胜感激。

【问题讨论】:

from Meter m1 where exists (select * from Meter m2 where m2.accountnumber = m1.accountnumber and m2.startdate <> m1.startdate)? 感谢@GSerg .. 这完全符合我的要求。 【参考方案1】:

你可以试试下面的查询

select ROW_NUMBER() OVER(ORDER BY m.AccountNumer)RowNo    , m.AccountNumer,m.MeterNumber,m.StartDate 
from meter m
INNER JOIN meter n ON m.AccountNumer=n.AccountNumer
and m.StartDate <> n.StartDate

如果您遇到任何问题或需要任何更改,请告诉我。

【讨论】:

我对同一类型的要求有一些疑问,我已经为该问题创建了另一个帖子。您可能能够快速回答,因为您已经知道这种情况。你能看看这个吗? ***.com/questions/68025222/…【参考方案2】:

您可以为此使用窗口函数。

我们只是按AccountNumber 对结果进行分区,并检查每个分区的最大和最小StartDate 是否不同。

SELECT *
FROM (
    SELECT *,
      MinDate = MIN(m.StartDate) OVER (PARTITION BY m.AccountNumber),
      MaxDate = MAX(m.StartDate) OVER (PARTITION BY m.AccountNumber)
    FROM Meter m
) m
WHERE MinDate <> MaxDate;

【讨论】:

我对同一类型的要求有一些疑问,我已经为该问题创建了另一个帖子。您可能能够快速回答,因为您已经知道这种情况。你能看看这个吗? ***.com/questions/68025222/…

以上是关于如何比较来自同一列和不同行但同一表的值?的主要内容,如果未能解决你的问题,请参考以下文章

如何计算同一张表的两个不同行中的值?

在一个表中的不同行和不同列中查找相同的值SQL

添加两个变量,其中包含来自同一数据库的两个不同表的值

Oracle:使用来自同一表的聚合值更新表中的值

如何将约束添加到 MYSQL 中的列仅以保存已存在于同一表的另一列中的值? [复制]

Oracle:Sql根据同一表另一行的值更新同一表的行