【问题标题】:SQL Server find each occurrence in table when it passes certain valueSQL Server 在传递某个值时查找表中的每个匹配项
【发布时间】:2018-08-09 00:56:57
【问题描述】:

我在表格中有一些数据。

<table>
<tr>
<td>id</td>
<td>date&nbsp;</td>
<td>value</td>
</tr>
<tr>
<td>1</td>
<td>1/1/2018 12:15&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
<td>90</td>
</tr>
<tr>
<td>2</td>
<td>1/1/2018 12:16</td>
<td>89</td>
</tr>
<tr>
<td>3</td>
<td>1/1/2018 12:17</td>
<td>88</td>
</tr>
<tr>
<td>4</td>
<td>1/1/2018 12:18</td>
<td>91</td>
</tr>
<tr>
<td>5</td>
<td>1/1/2018 12:19</td>
<td>92</td>
</tr>
<tr>
<td>6</td>
<td>1/1/2018 12:20</td>
<td>91</td>
</tr>
<tr>
<td>7</td>
<td>1/1/2018 12:21</td>
<td>89</td>
</tr>
<tr>
<td>8</td>
<td>1/1/2018 12:22</td>
<td>90</td>
</tr>
<tr>
<td>9</td>
<td>1/1/2018 12:23</td>
<td>91</td>
</tr>
<tr>
<td>10</td>
<td>1/1/2018 12:24</td>
<td>85</td>
</tr>
</table>

我需要的是每次值低于 90 时找到,然后相应地为它们分配组。一旦低于 90,保持相同的组,直到达到 90 或高于 90。然后更改 groupId 等等。 所以在上面的例子中

<table>
    <tr>
    <td>id</td>
    <td>date&nbsp;</td>
    <td>value</td>
    <td>goingBelow90</td>
    <td>group</td>
    </tr>
    <tr>
    <td>1</td>
    <td>1/1/2018 12:15&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
    <td>90</td>
    <td>N</td>
    <td>1</td>
    </tr>
    <tr>
    <td>2</td>
    <td>1/1/2018 12:16</td>
    <td>89</td>
     <td>Y</td>
      <td>2</td>
    </tr>
    <tr>
    <td>3</td>
    <td>1/1/2018 12:17</td>
    <td>88</td>
     <td>Y</td>
      <td>2</td>
    </tr>
    <tr>
    <td>4</td>
    <td>1/1/2018 12:18</td>
    <td>91</td>
     <td>N</td>
      <td>3</td>
    </tr>
    <tr>
    <td>5</td>
    <td>1/1/2018 12:19</td>
    <td>92</td>
     <td>N</td>
      <td>3</td>
    </tr>
    <tr>
    <td>6</td>
    <td>1/1/2018 12:20</td>
    <td>91</td>
     <td>N</td>
      <td>3</td>
    </tr>
    <tr>
    <td>7</td>
    <td>1/1/2018 12:21</td>
    <td>89</td>
     <td>Y</td>
      <td>4</td>
    </tr>
    <tr>
    <td>8</td>
    <td>1/1/2018 12:22</td>
    <td>90</td>
     <td>N</td>
      <td>5</td>
    </tr>
    <tr>
    <td>9</td>
    <td>1/1/2018 12:23</td>
    <td>91</td>
     <td>N</td>
      <td>5</td>
    </tr>
    <tr>
    <td>10</td>
    <td>1/1/2018 12:24</td>
    <td>85</td>
     <td>Y</td>
      <td>6</td>
    </tr>
    </table>

在跳了几圈之后,我能够做到这一点,但它的效率为 0%。在获取 10k 条记录和分配组的同时进行查询大约需要 7 分钟,这是不可接受的。 请告诉我

【问题讨论】:

    标签: sql sql-server find-occurrences


    【解决方案1】:

    组值似乎是该值累计超过 90 的次数的总和。这在 SQL 中很容易表达:

    select t.*,
           sum(case when value >= 90 then 1 else 0 end) over (order by date) as grp
    from t;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多