3

我有一个包含 Client_ID 和 Communication_Date 的表,我想在下表中生成。表应该列出以前和最后的通信日期。有什么方法可以为它编写查询吗?任何帮助将不胜感激。

谢谢

ORIGINAL TABLE

ID    Client_ID     Communication_date
1     1001          01-05-2013
2     1002          01-05-2013
3     1003          02-05-2013
4     1001          09-05-2013
5     1001          14-05-2013
6     1002          18-05-2013
7     1002          25-05-2013



Requested Table
Client_ID           PreviousCom_Date       LastCom_date
1001                01-05-2013             09-05-2013
1001                09-05-2013             14-05-2013
1002                01-05-2013             18-05-2013
1002                18-05-2013             25-05-2013
1003                02-05-2013             Null or whatever
4

1 回答 1

4

分析LAG功能将为您配对日期。这将配对当前/以前的日期:

SELECT
  Client_ID,
  Communication_Date AS PreviousCom_Date,
  LAG(Communication_Date) OVER (
    PARTITION BY Client_ID
    ORDER BY Communication_Date DESC) AS LastCom_Date
FROM PrevTable;

然后是确保只包含具有“上一个”和“上一个”值的行的问题,除非像 Client_ID 1003 一样,源表中只有一行。这可以通过计算Client_ID行数并检查 (a) 客户仅一行或 (b) 如果客户多于一行,则两个日期都必须具有值来解决:

SELECT * FROM (
  SELECT
    Client_ID,
    Communication_Date AS PreviousCom_Date,
    LAG(Communication_Date) OVER (
      PARTITION BY Client_ID
      ORDER BY Communication_Date DESC) AS LastCom_Date,
    COUNT(*) OVER (
      PARTITION BY Client_ID) AS DatePair_Count
  FROM PrevTable
  )
WHERE DatePair_Count = 1
   OR (PreviousCom_Date IS NOT NULL AND LastCom_Date IS NOT NULL)

只需在上述查询之前使用CREATE TABLE whatever AS,它将创建新表。

这里SELECT有一个语句的 SQL Fiddle 。

于 2013-06-14T20:46:16.557 回答