使用一组两个值中的值填充列时出现问题,具体取决于连续行之间的差异

时间:2014-06-01 11:17:48

标签: sql ms-access

我有一个令人沮丧的麻烦,我想在一个例子上显示

表(ID,姓名,SUBNAME,ID2,得分)

ID  Name   Subname ID2 Score

1    A     A87564   1    <
2    A     A87564   2    <
3    A     A87564   3    <
4    A     A78564   1    >
5    A     A78564   2    >
6    B     B23456   1    <
7    B     B23456   2    <
8    B     B32456   1    >
9    B     B32456   2    >
5    B     B32456   3    >
6    C     C89004   1    <
..........................
..........................

每个名称总有两个不同的子名称,但具有相同子名称的行数不是常量。我故意在Subname单元格中编写了一组数字,以显示它在具有相同名称的行之间的变化。正如您所看到的,每个名称的最后三个数字是相同的,两个第一个数字会改变位置。

我设法使用

填写ID2列

( SELECT COUNT(T2.Subname) FROM Table AS T2 WHERE T2.ID <= T.ID AND T.Subname = T2.Subname ) AS ID2

但我完全没有尝试分配&#39;&lt;&#39;或者&#39;&gt;&#39;取决于子名称或ID2的图标在连续行之间发生变化。分配这些图标中的哪一个并不重要。唯一的条件是它应该在相同名称的子名称之间进行更改。

我试图使用许多sql工具和函数修复它,使用ID2差异甚至尝试基于子名称文字差异。

如果您有任何想法可以帮助我,请告诉我。

1 个答案:

答案 0 :(得分:-1)

几乎可以用子查询完成,(将你的工作查询作为子查询说&#34;当前&#34;并加入它自己(&#34;之前的#34;),并比较一行&# 39; s值为max(previous.identifier)小于current.identifier的行中的值,但这可能是mysql内联变量将使其更具可读性和更高性能的情况。所以这是一个不完美的开始:

select ID,Name,Subname,ID2,
  if( @lastSubname = Subname or @lastSubname="", @flip, @flop ) as Score,
  if (@lastSubname = Subname or @lastSubname="", @temp:="", @temp:=@flip) as a,
  if (@lastSubname = Subname or @lastSubname="", @temp:="", @flip:=@flop) as b,
  if (@lastSubname = Subname or @lastSubname="", @temp:="", @flop:=@temp) as c,
  @lastSubname:=Subname
from t1, ( select @lastSubname := "", @flip :="<", @flop :=">" , @temp:="") Vars
order by Subname

select @lastSubname...初始化变量,并在&#34; end&#34;更新变量。每行(在你需要检查之后)。更改值时会交换flipflop。可能很容易有一种更简洁的方式来做这件事...我正在玩here on sqlFiddle