Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL获取最新记录_Sql_Date_Row_Combinations - Fatal编程技术网

SQL获取最新记录

SQL获取最新记录,sql,date,row,combinations,Sql,Date,Row,Combinations,我在这里绞尽脑汁想从这个表格中拿出两个结果。我有一个不同类型、项目和值的表,这些表是在不同的日期添加的 Type Item Value Date 1 10 111 20160101 1 10 122 20170101 1 11 222 20170101 1 12 312 20170101 2 10 144 20160101 2 10 155 20170101 2 11 105 20160101 2

我在这里绞尽脑汁想从这个表格中拿出两个结果。我有一个不同类型、项目和值的表,这些表是在不同的日期添加的

Type Item Value Date
1    10   111   20160101
1    10   122   20170101
1    11   222   20170101
1    12   312   20170101
2    10   144   20160101
2    10   155   20170101
2    11   105   20160101
2    11   133   20170101
2    11   123   20180101
3    10   111   20170101
首先,我想只有最新的日期,显示在类型的组合,项目。我尝试过这个查询,但它会显示所有日期

SELECT Type, Item, Value, MAX(Date) as Date from TABLENAME
WHERE Type='1' or Type='2'
GROUP BY Type, Item, Value
下面是我希望它看起来像什么

Type Item Value Date
1    10   122   20170101
1    11   222   20170101
1    12   312   20170101
2    10   155   20170101
2    11   123   20180101
然后我们有一个更棘手的问题,在这里我完全不知所措,不确定这是否可能,或者也许我应该用其他方式来做?我想看看类型为1的项是否有值,而类型为2的项是否没有值。或者反过来说。显示在新表中

Item Type1 Type2 Date
10   1     2     20170101 -> Item 10 has values with both type 1,2 on specific date
11   1           20170101 -> Item 11 has only a value when type 1 on specific date
11         2     20180101 -> Item 11 has only a value when type 2 on specific date
12   1           20170101 -> Item 12 has only a value when type 1 on specific date

对于第一个场景,您可以使用以下查询

SELECT Type, Item, Value, Date from TABLENAME
WHERE (Type='1' or Type='2') and date = (SELECT MAX(Date) from TABLENAME)

对于你的第一个问题,我认为你可以使用:

SELECT A.TYPE, A.ITEM, A.VALUE, A.DATE 
FROM TABLENAME A
INNER JOIN ON (SELECT TYPE, ITEM, MAX(DATE) AS MAXDATE
                FROM TABLENAME
                GROUP BY TYPE, ITEM) B ON A.TYPE = B.TYPE AND A.ITEM = B.ITEM AND A.DATE=B.MAXDATE
WHERE A.TYPE='1' OR A.TYPE='2'
第二,你可以试试这个:

SELECT DISTINCT A.ITEM, B.TYPE AS TYPE1, C.TYPE AS TYPE2, CASE WHEN B.TYPE IS NOT NULL THEN B.DAT ELSE C.DAT END AS DATE_X 
FROM 
    (SELECT ITEM, TYPE, MAX(DATE) AS DAT
     FROM ITEM
     GROUP BY ITEM, TYPE) A
     LEFT JOIN (SELECT ITEM, TYPE, MAX(DATE) AS DAT FROM ITEM WHERE TYPE='1' GROUP BY ITEM, TYPE) B ON A.ITEM = B.ITEM AND A.DAT= B.DAT
     LEFT JOIN (SELECT ITEM, TYPE, MAX(DATE) AS DAT FROM ITEM WHERE TYPE='2' GROUP BY ITEM, TYPE) C ON A.ITEM = C.ITEM AND A.DAT= C.DAT
输出:

    ITEM    TYPE1   TYPE2   DATE_X
1   10  1   2   20170101
2   11  NULL    2   20180101
3   11  1   NULL    20170101
4   12  1   NULL    20170101

第一个很好地工作时,只是删除了内部联接后的ON。谢谢你用的是什么数据库?我用的是MS SQL。这似乎很有效,但我得到的结果与你不同。相同,但我在Type2的第1行中得到一个空值。它不会同时显示Type1和Type2中的值。您是否检查了示例数据?它们是否与你在问题中发布的内容相同?你可以试试这个,我只是简单地删除所有与日期相关的内容,但如果它不符合你的新要求,最好打开另一个问题,留出更多的空间来写。从选择项中选择不同的A.ITEM,B.TYPE作为TYPE1,C.TYPE作为TYPE2,按项分组从项中键入,按项分组从TYPE='1'处键入,按项分组从项中键入,A.ITEM=B.ITEM从项分组从TYPE='2'处键入,在A.ITEM=C.ITEM上键入C。此查询不会解决第一个场景。例如,如果两种类型之间的“最大日期”不同,它将放弃其中一种类型的结果。