如何在sql查询中获得最大连续记录条目?

时间:2015-12-04 03:34:33

标签: sql-server sql-server-2008

我知道如何在sql查询中使用MAX()函数和GROUP BY子句,但在我的情况下,我想要分组的记录有点不同。

例如我有一个下表

HostName   ModifyDate                Sr No
-------------------------------------------
PC-1       2015-12-04 08:45:52.847   1
PC-1       2015-12-04 08:48:51.025   2
PC-2       2015-12-04 08:50:01.125   3
PC-2       2015-12-04 08:50:45.545   4
PC-2       2015-12-04 08:53:44.897   5
PC-1       2015-12-04 09:02:17.524   6
PC-2       2015-12-04 09:18:36.788   7
PC-2       2015-12-04 09:22:01.041   8
PC-1       2015-12-04 09:31:41.744   9

结果应该是这样的

HostName   ModifyDate                Sr No
------------------------------------------
PC-1       2015-12-04 08:48:51.025   2
PC-2       2015-12-04 08:53:44.897   5
PC-1       2015-12-04 09:02:17.524   6
PC-2       2015-12-04 09:22:01.041   8
PC-1       2015-12-04 09:31:41.744   9

Sql Fiddle

以上结果显示了连续HostName记录的最大日期记录。你可以看到有3个条目(SrNo 3,4,5)但我只拿了5个,这是最新的三个。在前两个记录(SrNo 1,2)中也使用了相同的场景我只获得了第二个记录,这是最近的两个记录。

问题在于我无法获取最大日期记录。如果我将MAX(ModifyDate)HostName组一起使用,那么它将只返回最新的两个记录(Sr No 8和9)。我想获取每个连续HostName条目的最大记录。

注意:我无法为其创建存储过程。我希望通过单个sql语句获取该记录。表中没有Sr No字段。我只是为了理解这个案子。

2 个答案:

答案 0 :(得分:1)

这是Grouping Islands of Contiguous Dates问题,可以使用ROW_NUMBER

解决

SQL Fiddle

WITH Cte AS(
    SELECT *,
        grp     = ROW_NUMBER() OVER(ORDER BY ModifyDate) -
                  ROW_NUMBER() OVER(PARTITION BY HostName ORDER BY ModifyDate),
        SrNo    = ROW_NUMBER() OVER(ORDER BY ModifyDate)
    FROM LOG
),
CteFinal AS(
    SELECT *,
        rn = ROW_NUMBER() OVER(PARTITION BY HostName, grp ORDER BY SrNo DESC)
    FROM Cte
)
SELECT
    HostName, ModifyDate, SrNo
FROM CteFinal
WHERE rn = 1
ORDER BY SrNo

答案 1 :(得分:1)

你可以尝试这种方法..

SQL Fiddle

  <input type="hidden" name="item_name" value="Donation to YOUR_BUSINESS_NAME">
  <label><input type="text" name="amount" size="4"/>Donation Amount</label>

  <label><input name="on0" id="checkbox_gift_membership" value="This is a gift membership." type="checkbox">This is a gift membership.</label>

  <table>
   <caption>Gift Recepient information</caption>
   <tbody>
    <tr>
     <td><label><input name="on1" value="Name" type="hidden">Name</label></td>
     <td><input name="os1" maxlength="200" type="text"></td>
    </tr>
    <tr>
     <td><label><input name="on2" value="Address" type="hidden">Address</label></td>
     <td><input name="os2" maxlength="200" type="text"></td>
    </tr>
    <tr>
     <td><label><input name="on3" value="City" type="hidden">City</label></td>
     <td><input name="os3" maxlength="200" type="text"></td>
    </tr>
    <tr>
     <td><label><input name="on4" value="State" type="hidden">State</label></td>
     <td><input name="os4" maxlength="200" type="text"></td>
    </tr>
    <tr>
     <td><label><input name="on5" value="ZIP code" type="hidden">ZIP code</label></td>
     <td><input name="os5" maxlength="200" type="text"></td>
    </tr>
    <tr>
     <td><label><input name="on6" value="Phone number" type="hidden">Phone number</label></td>
     <td><input name="os6" maxlength="200" type="text"></td>
    </tr>
    <tr>
     <td><label><input name="on7" value="Email" type="hidden">Email</label></td>
     <td><input name="os7" maxlength="200" type="text"></td>
    </tr>
   </tbody>
  </table>

  <label><input name="on8" id="checkbox_news_updates" value="I would like to receive news and updates." type="checkbox">I would like to receive news and updates.</label>

  <input type="image" src="https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">

</form>